자바 병렬 프로 그래 밍 테마(8)---(JUC)인 스 턴 스 설명 CountDownlatch

"Countdown Latch 는 매우 실 용적 인 다 중 스 레 드 제어 도구 클래스 입 니 다."Count Down'은 영어 로 역수 라 는 뜻 이 고,Latch 는 문 으로 묻는다 는 뜻 이다.만약 번역 이 역수 문 밸브 가 된다 면,나 는 모두 가 무슨 말 인지 모른다 고 느 낄 것 이 라 고 생각한다.그래서 간단하게 카운터 라 고 부른다.여기 서 문 이 묻 는 의 미 는 문 을 잠 그 고 안의 스 레 드 가 뛰 어 나 오지 못 하 게 하 는 것 이다.따라서 이 도 구 는 보통 스 레 드 기다 림 을 제어 하 는 데 사 용 됩 니 다.카운트다운 이 끝 날 때 까지 한 스 레 드 를 기다 리 게 하고 실행 을 시작 할 수 있 습 니 다.
Countdown Latch 의 구조 함 수 는 현재 이 카운터 의 개수 인 정 수 를 매개 변수 로 받 습 니 다.

public CountDownLatch(int count)
Countdown Latch 는 다른 스 레 드 에서 실행 중인 작업 을 완료 하기 전에 하나 이상 의 스 레 드 를 기다 릴 수 있 도록 동기 화 보조 클래스 입 니 다.Countdown Latch 가 주어진 개수 로 초기 화 되 었 습 니 다.현재 계수 가 0 일 때 까지 await 방법 을 사용 하여 차단 합 니 다.countDown()방법 을 호출 한 후에 모든 기다 리 는 스 레 드 가 풀 리 고 후속 호출 await 는 즉시 돌아 갑 니 다.이것 은 일회 성 현상 입 니 다.-계 수 는 리 셋 할 수 없습니다.리 셋 계수 가 필요 하 다 면 Cyclic Barrier 를 사용 하 는 것 을 고려 해 Cyclic Barrier 의 계수 기 를 리 셋 해서 사용 할 수 있 기 때문에 순환 의 barrier 라 고 불 린 다.
주요 방법:

//                     ,       。
void await()
//                     ,                  。
boolean await(long timeout, TimeUnit unit)
//         ,       ,          。
void countDown()
//       。
long getCount()
우 리 는 예 를 하나 보 자.

public class TestCountDownLatch {
  private static final int RUNNER_NUMBER = 5; //      
  private static final Random RANDOM = new Random();
  public static void main(String[] args) {
    //                        ,    5    ,     5
    CountDownLatch readyLatch = new CountDownLatch(RUNNER_NUMBER);
    //             ,         ,     1
    CountDownLatch startLatch = new CountDownLatch(1);
    for (int i = 0; i < RUNNER_NUMBER; i++) {
      Thread t = new Thread(new Runner((i + 1) + "    ", readyLatch, startLatch));
      t.start();
    }
    try {
      readyLatch.await();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    startLatch.countDown();
    System.out.println("  :         ,  ...");
  }
  static class Runner implements Runnable {
    private CountDownLatch readyLatch;
    private CountDownLatch startLatch;
    private String name;
    public Runner(String name, CountDownLatch readyLatch, CountDownLatch startLatch) {
      this.name = name;
      this.readyLatch = readyLatch;
      this.startLatch = startLatch;
    }
    public void run() {
      int readyTime = RANDOM.nextInt(1000);
      System.out.println(name + ":   " + readyTime + "     .");
      try {
        Thread.sleep(readyTime);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      System.out.println(name + ":       .");
      readyLatch.countDown();
      try {
        startLatch.await(); //          
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      System.out.println(name + ":  ...");
    }
  }
}
인쇄 결과:
1 번 선수:준비 할 시간 이 547 초 필요 합 니 다.
2 번 선수:준비 할 시간 이 281 초 필요 합 니 다.
4 번 선수:563 초 동안 준비 해 야 합 니 다.
5 번 선수:916 초 동안 준비 할 시간 이 필요 합 니 다.
3 번 선수:준비 할 시간 이 461 초 필요 합 니 다.
2 번 선수:저 는 이미 준 비 를 마 쳤 습 니 다.
3 번 선수:저 는 이미 준 비 를 마 쳤 습 니 다.
1 번 선수:저 는 이미 준 비 를 마 쳤 습 니 다.
4 번 선수:저 는 이미 준 비 를 마 쳤 습 니 다.
5 번 선수:저 는 이미 준 비 를 마 쳤 습 니 다.
심판:모든 선수 들 준비 완료,시작...
3 번 선수:달리기...
2 번 선수:달리기...
1 번 선수:달리기...
4 번 선수:달리기...
5 번 선수:달리기...
Process finished with exit code 0
메모:계수 기 는 0 보다 커 야 합 니 다.0 일 뿐 계수 기 는 0 입 니 다.await 방법 을 호출 할 때 현재 스 레 드 를 막 지 않 습 니 다.
이상 은 자바 병행 프로 그래 밍 테마(8)-(JUC)인 스 턴 스 설명 CountDownlatch 의 상세 한 내용 입 니 다.자바 jc CountDownlatch 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기