CountDownlatch 동기 화 도구 클래스 사용 설명

CountDownlatch 사용 설명 을 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
Countdown Latch 는 자바.util.concurrent 패키지 의 다음 동기 화 도구 클래스 입 니 다.다른 스 레 드 에서 한 그룹 이 실 행 될 때 까지 한 개 이상 의 스 레 드 를 기다 릴 수 있 습 니 다.
Countdown Latch 의 용법 은 매우 간단 합 니 다.아래 의 예 도 제 가 인터넷 에서 본 것 입 니 다.매우 적절 합 니 다.여기에 붙 여 주세요.

public class Test {

  public static void main(String[] args) {
    CountDownLatch begin = new CountDownLatch(1);
    CountDownLatch end = new CountDownLatch(2);

    for(int i=0; i<2; i++){
      Thread thread = new Thread(new Player(begin,end));
      thread.start();
    }

    try{
      System.out.println("the race begin");
      begin.countDown();
      end.await();
      System.out.println("the race end");
    }catch(Exception e){
      e.printStackTrace();
    }

  }
}


/**
 *   
 */
class Player implements Runnable{

  private CountDownLatch begin;

  private CountDownLatch end;

  Player(CountDownLatch begin,CountDownLatch end){
    this.begin = begin;
    this.end = end;
  }

  public void run() {
    
    try {
      begin.await();
      System.out.println(Thread.currentThread().getName() + " arrived !");;
      end.countDown();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

  }
}


다음은 실행 결과 입 니 다.

Count Downlatch 를 통 해 스 레 드 의 실행 순 서 를 제어 하 는 것 을 볼 수 있 습 니 다.
위의 코드 에서 우 리 는 await()방법 과 countDown()방법 을 사용 합 니 다.우 리 는 그것들 각자 의 작용 을 검증 해 보 자.
우선 await()방법 을 검증 합 니 다.main 방법 중의 end.awat()주석 을 지 웁 니 다.다음은 주석 이 떨 어 진 후의 실행 결과 입 니 다.

메 인 스 레 드 가 대표 선수 의 스 레 드 가 끝나 기 를 기다 리 지 않 고 경기 가 끝났다 고 발표 하 는 것 을 볼 수 있 습 니 다!처음부터 끝 난 경기-
여기 서 알 수 있 듯 이 await()방법 은 차단 작용 을 한다.
그 다음 에 countDown 방법 을 검증 하고 선수 라인 을 대표 하 는 end.countDown()을 주석 합 니 다.다음은 실행 결과 입 니 다.

프로그램 이 계속 운영 되 고 있 고 모든 선수 가 결승점 에 도 착 했 지만 심판 은 경기 가 끝 났 음 을 알 리 지 않 고 무엇 을 기다 리 고 있 을 까?
우 리 는 countDown()방법 이 차단 라인 을 깨 우 는 작용 을 할 것 이 라 고 추측한다.
차단 스 레 드 를 깨 우 는 역할 을 하 는 이상 한 번 만 countDown()방법 을 사용 하면 차단 되 는 메 인 스 레 드 를 깨 울 수 있 지 않 습 니까?
위 에 있 는 cout Down()의 설명 을 취소 하고 선 수 를 다시 만 듭 니 다.코드 는 다음 과 같 습 니 다.

class Player2 implements Runnable{

    private CountDownLatch begin;

    private CountDownLatch end;

    Player2(CountDownLatch begin,CountDownLatch end){
      this.begin = begin;
      this.end = end;
    }

    public void run() {
      
      try {
        begin.await();
        System.out.println(Thread.currentThread().getName() + " arrived !");
//        end.countDown();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }

    }
  }

main 방법 도 다음 과 같이 수정 하여 서로 다른 선 수 를 만 들 었 습 니 다.

public static void main(String[] args)
  {
    CountDownLatch begin = new CountDownLatch(1);
    CountDownLatch end = new CountDownLatch(2);
    
    Thread thread = new Thread(new Player(begin, end));
    thread.start();
    
    Thread thread2 = new Thread(new Player2(begin, end));
    thread2.start();
    
    try
    {
      System.out.println("the race begin");
      begin.countDown();
      end.await();
      System.out.println("the race end");
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
    
  }
실행 해 보 세 요.다음은 결과 입 니 다.

메 인 프로그램 이 계속 막 혀 서 깨 어 나 지 않 았 습 니 다.심판 은 화장실 에 오래 갔 습 니 다!
그 러 고 보 니 countDown()은 스 레 드 를 직접 깨 우 는 것 이 아니 라 카운터,카운트다운 같은 것 입 니 다.
API 문 서 를 보십시오.과연 구조 함수 에 인자 2 를 추 가 했 습 니 다.countDown()을 2 번 호출 해 야 합 니 다.  end.awat()가 막 힌 스 레 드 를 깨 울 수 있 습 니 다.

CountDownLatch end = new CountDownLatch(2); 
총괄 해 보면,
  1、CountDownLatch end = new CountDownLatch(N); //대상 을 구성 할 때 인자 N 을 입력 해 야 합 니 다.
  2、end.await()  N 회 end.countDown()방법 을 호출 할 때 까지 스 레 드 를 막 을 수 있 습 니 다.
3.end.countDown()은 여러 스 레 드 에서 호출 할 수 있 습 니 다.  호출 횟수 를 계산 하 는 것 은 모든 스 레 드 호출 횟수 의 총화 이다.
 다음 블 로 그 는 Count Downlatch 의 작업 원 리 를 소스 차원 에서 설명 할 것 이다.
 이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기