자바 병렬 프로 그래 밍 스 레 드 간 통신 실현 과정 상세 설명

자바 중선 간 통신 에는 여러 가지 방식 이 있 습 니 다.저 는 자주 사용 하 는 방식 을 열거 하고 코드 로 그들 이 어떻게 실현 하 는 지 보 여 드 리 겠 습 니 다.
  • 공유 변수
  • wait,notify,notify All(이 세 가지 방법 은 Object 대상 의 방법 이 며 synchronized 키워드 와 결합 하여 사용 해 야 합 니 다)
  • CyclicBarrier、CountDownLatch
  • LockSupport 활용
  • 잠 금/컨 디 션 메커니즘
  • 파이프,파이프 출력 흐름 Piped Output Stream 과 파이프 입력 흐름 Piped Input Stream 만 들 기
  • 예시 1:
    
    package com.zhi.test;
    
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.atomic.AtomicInteger;
    
    import org.junit.Test;
    
    /**
     * Java   -      <br>
     * flag      JobB  ,notify  Job  ,CountDownLatch       
     * 
     * @author    
     * @since 2020 5 4 21:51:24
     *
     */
    public class ThreadTest2 {
      private CountDownLatch latch;
      private volatile boolean flag = true;
      private Object lock = new Object();
      private AtomicInteger num = new AtomicInteger(0);
    
      class JobA implements Runnable {
        @Override
        public void run() {
          synchronized (lock) {
            flag = false;
            if (num.get() != 3) {
              try {
                lock.wait(); // wait      
              } catch (InterruptedException e) {
              }
            }
            System.out.println("  A    ,      ");
          }
          latch.countDown();
        }
      }
    
      class JobB implements Runnable {
        @Override
        public void run() {
          while (flag) { //   JobA     
    
          }
          synchronized (lock) {
            for (int i = 1; i <= 5; i++) {
              try {
                Thread.sleep(1000);
              } catch (InterruptedException e) {
              }
              int a = num.incrementAndGet();
              System.out.println("  B " + i + "   ,num  :" + a);
              if (a == 3) {
                lock.notify(); //   JobB  ,notify       
              }
            }
          }
          latch.countDown();
        }
      }
    
      @Test
      public void test() {
        latch = new CountDownLatch(2);
        new Thread(new JobA()).start();
        new Thread(new JobB()).start();
        try {
          latch.await(); //   2        
        } catch (InterruptedException e) {
        }
      }
    }
    결과 출력:
    퀘 스 트 B 첫 번 째 실행,num 값:1
    퀘 스 트 B 2 차 실행,num 값:2
    퀘 스 트 B 세 번 째 실행,num 값:3
    퀘 스 트 B 4 차 실행,num 값:4
    퀘 스 트 B 다섯 번 째 실행,num 값:5
    퀘 스 트 A 알림 을 받 고 작업 을 계속 수행 합 니 다.
    예시 2:
    
    package com.zhi.test;
    
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.locks.LockSupport;
    
    import org.junit.Test;
    
    /**
     * Java   -      ,  LockSupport
     * 
     * @author    
     * @since 2020 5 4 21:51:24
     *
     */
    public class ThreadTest3 {
      private CountDownLatch latch;
      private volatile int num = 0;
      private Thread ta;
      private Thread tb;
    
      class JobA implements Runnable {
        @Override
        public void run() {
          if (num != 3) {
            LockSupport.park();
          }
          System.out.println("  A    ,      ");
          latch.countDown();
        }
      }
    
      class JobB implements Runnable {
        @Override
        public void run() {
          for (int i = 1; i <= 5; i++) {
            try {
              Thread.sleep(1000);
            } catch (InterruptedException e) {
            }
            num++;
            System.out.println("  B " + i + "   ,num  :" + num);
            if (num == 3) {
              LockSupport.unpark(ta); // unpark         
            }
          }
          latch.countDown();
        }
      }
    
      @Test
      public void test() {
        latch = new CountDownLatch(2);
        ta = new Thread(new JobA());
        tb = new Thread(new JobB());
        ta.start();
        tb.start();
        try {
          latch.await(); //   2        
        } catch (InterruptedException e) {
        }
      }
    }
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기