자바 스 레 드 간 통신 방법 총화

머리말
동시 프로 그래 밍 에서 우 리 는 이런 장면 을 만 날 수 있다.
A,B 두 라인 이 병행 되 지만,나 는 B 라인 이 A 라인 이 실 행 된 후에 다시 실행 되 기 를 희망 한다
이 럴 때 는 스 레 드 간 통신 이 필요 하 다.
A.집행 이 끝 난 후에 B 에 게'여보세요,B,저 는 집행 이 끝 났 습 니 다.'라 고 말 했다.
자,강 강 강 이 자바 로 어떻게 이 루어 지 는 지.
1.synchronized 기반
2.reentrentLock 기반
3.volatile 기반
4.countDownlatch 기반
나 는 지금 이 네 가 지 를 알 고 있다.
1.synchronized+wait()와 notify()
wait()와 notify()는 모두 Object 류 의 통신 방법 입 니 다.주의 하 세 요.wait 와 notify 는 synchronized 와 함께 사용 해 야 합 니 다.또한 wait()는 자 물 쇠 를 풀 고 notify()는 자 물 쇠 를 풀 지 않 습 니 다.

public class SynchronizedTest {

 //   year,            
 private static double year;

 public void run() {
  //  A,    rap
  Thread threadA = new Thread(() -> {
   synchronized (this) {
    for (year = 0.5; year <= 5; year += 0.5) {
     System.out.println("         rap:   " + year + " ");
     try {
      Thread.sleep(288);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
     //    ,         
     if (year == 2.5) {
      System.out.println("===========================>       ,  !!!");
      this.notify();
     }
    }
   }
  });
  //  B,     
  Thread threadB = new Thread(() -> {
   while (true) {
    synchronized (this) {
     try {
      this.wait();
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
     System.out.println("          ");
    }
   }
  });
  //  ,      B,     B      
  threadB.start();
  threadA.start();
 }

 public static void main(String[] args) {
  SynchronizedTest test = new SynchronizedTest();
  test.run();
 }
}
실행 결과:
채 서 계 랩 연습 시작:0.5 년
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작 2.5 년
================================
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작 4.5 년
채 서 계 랩 연습 시작
채 서 계 는 농 구 를 연습 하기 시작 했다.
실행 결 과 를 주의 하 십시오.스 레 드 A 는 notify 를 실행 한 후에 자 물 쇠 를 풀 지 않 고 현재 작업 을 수행 한 후에 스 레 드 B 의 작업 을 시작 합 니 다.
2.ReentrantLock 기반
ReentrantLock 도 스 레 드 간 통신 을 실현 할 수 있 지만 좀 귀 찮 습 니 다.ReentrantLock 의 Condition 과 결합 해 야 합 니 다.

public class LockTest {
  //   year,               
  private static double year;

  public static void main(String[] args) {
   ReentrantLock lock = new ReentrantLock();
   Condition condition = lock.newCondition();
   //  A,    rap
   Thread threadA = new Thread(() -> {
    //         
    lock.lock();
    for (year = 0.5; year <= 5; year += 0.5) {
     System.out.println("         rap:   " + year + " ");
     try {
      Thread.sleep(288);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
     //    ,         
     if (year == 2.5) {
      System.out.println("===========================>       ,  !!!");
      //        
      condition.signal();
     }
    }
    //          
    lock.unlock();
   });
   //  B,     
   Thread threadB = new Thread(() -> {
    //         
    lock.lock();
    while (true) {
     try {
      //     ,      0  ,     
      condition.await();
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
     System.out.println("            ");
     break;
    }
    //          
    lock.unlock();
   });
   //  ,      B,     B      
   threadB.start();
   threadA.start();
  }
 }
실행 결과:
채 서 계 랩 연습 시작:0.5 년
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작 2.5 년
================================
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작 4.5 년
채 서 계 랩 연습 시작
채 서 씨 암탉 이 농 구 를 연습 하기 시작 했다.
효 과 는 synchronized+wait()와 notify()와 같 습 니 다.
3.volatile 기반
공유 변 수 를 사용 해도 실현 할 수 있 습 니 다.volatile 을 사용 하면 됩 니 다.원 리 는 여러 스 레 드 가 같은 변 수 를 공동으로 감청 하고 변수의 값 변화 에 따라 대응 하 는 임 무 를 수행 하 는 것 입 니 다.여기 서 volatile 의 역할 은 다른 스 레 드 가 변수 값 의 변 화 를 즉시 감지 할 수 있 도록 하 는 것 입 니 다.

public class volatileTest {
 //        ,  ,   volatile  
 static volatile boolean flag = false;
 //   year,               
 private static double year;

 public static void main(String[] args) {
  //  A,    rap
  Thread threadA = new Thread(() -> {
   while (true) {
    if (!flag) {
     for (year = 0.5; year <= 5; year += 0.5) {
      System.out.println("         rap:   " + year + " ");
      try {
       Thread.sleep(288);
      } catch (InterruptedException e) {
       e.printStackTrace();
      }
      //    ,         
      if (year == 2.5) {
       System.out.println("===========================>       ,  !!!");
       year = 0.5;
       flag = true;
       break;
      }
     }
    }
   }
  });
  //  B,     
  Thread threadB = new Thread(() -> {
   while (true) {
    if (flag) {
     System.out.println("            ");
     break;
    }
   }
  });
  //     
  threadA.start();
  threadB.start();
 }
}
실행 결과:
채 서 계 랩 연습 시작:0.5 년
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작 2.5 년
================================
채 서 씨 암탉 이 농 구 를 연습 하기 시작 했다.
CountDownlatch 기반
Countdown Latch 는 JUC 패키지 의 병렬 프로 그래 밍 도구 입 니 다.주로 두 가지 방법 이 있 습 니 다.countDown 과 await,Countdown Latch 바 텀 은 계수 기 를 유지 하고 있 습 니 다.예화 할 때 설정 합 니 다.countDown 방법 을 호출 할 때 계수 기 를 하나 줄 이 고 카운터 가 1 을 줄 이기 전에 0 이 되면 아무 일 도 일어나 지 않 습 니 다.1 을 줄 이면 0 이 됩 니 다.기다 리 는 모든 스 레 드 를 깨 웁 니 다.await 방법 은 카운터 가 0 일 때 까지 현재 스 레 드 를 기다 리 게 합 니 다.

public class CountDownLatchTest {
 //   year,               
 private static double year;

 public static void main(String[] args) {
  CountDownLatch latch = new CountDownLatch(1);
  //  A,    rap
  Thread threadA = new Thread(() -> {
   for (year = 0.5; year <= 5; year += 0.5) {
    System.out.println("         rap:   " + year + " ");
    try {
     Thread.sleep(288);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
    //    ,         
    if (year == 2.5) {
     System.out.println("===========================>       ,  !!!");
     //     
     latch.countDown();
    }
   }
  });
  //  B,     
  Thread threadB = new Thread(() -> {
   while (true) {
    try {
     //     ,      0  ,     
     latch.await();
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
    System.out.println("            ");
    break;
   }
  });
  //     
  threadA.start();
  threadB.start();
 }
}
실행 결과:
채 서 계 랩 연습 시작:0.5 년
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작 2.5 년
================================
채 서 계 랩 연습 시작
채 서 씨 암탉 이 농 구 를 연습 하기 시작 했다.
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작
채 서 계 랩 연습 시작 4.5 년
채 서 계 랩 연습 시작
만약 당신 이 몇 번 더 운행 한다 면,당신 은 라인 B 가 실행 하 는 시기 가 무 작위 인 것 을 발견 할 수 있 을 것 이다.그러나 영원히 계수기 가 0 이 된 후에 야 실행 을 시작 할 것 이다.즉,계수기 가 0 이 된 후에 라인 A 와 라인 B 가 자 물 쇠 를 빼 앗 은 사람 이 실행 하 는 것 이다.
글 에서 모든 demo 는 복사 하면 실행 할 수 있 습 니 다.여러분 은 손 을 많이 써 야 합 니 다.집에 조건 이 있 는 것 은 아이디어 로 뛰 어 다 니 고 조건 이 없 는 것 은 손 으로 베 낄 수 있 습 니 다.
총결산
자바 스 레 드 간 통신 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 스 레 드 간 통신 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기