Java에서 CountDownLatch 사용법 해석

2774 단어 javaCountDownLatch
CountDownLatch 클래스는 동기식 카운터로 구성할 때 int 파라미터를 전송합니다. 이 파라미터는 카운터의 초기 값입니다. countDown () 방법을 호출할 때마다 카운터가 1을 줄이고 카운터가 0보다 크면 await () 방법은 프로그램이 계속 실행하는 것을 막습니다.
CountDownLatch는 숫자를 거꾸로 계산하는 잠금 메모리로 숫자가 0으로 줄어들면 특정한 이벤트를 촉발합니다.이런 특성을 이용하여 주 스레드가 하위 스레드의 끝을 기다리게 할 수 있다.다음은 모의 선수 경기의 예로 설명한다.

 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executor;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
 public class CountDownLatchDemo {
   private static final int PLAYER_AMOUNT = 5;
   public CountDownLatchDemo() {
     // TODO Auto-generated constructor stub  
   }
   /**
   * @param args
   */
   public static void main(String[] args) {
     // TODO Auto-generated method stub
     // ,CountDownLatch 1 
     CountDownLatch begin = new CountDownLatch(1);
     // , 
     CountDownLatch end = new CountDownLatch(PLAYER_AMOUNT);
     Player[] plays = new Player[PLAYER_AMOUNT];
     
     for(int i=0;i<PLAYER_AMOUNT;i++)
       plays[i] = new Player(i+1,begin,end);
     
     // , 5
     ExecutorService exe = Executors.newFixedThreadPool(PLAYER_AMOUNT);
     for(Player p:plays)
       exe.execute(p);      // 
     System.out.println("Race begins!");
     begin.countDown();
     try{
       end.await();      // end 0, 
     }catch (InterruptedException e) {
       // TODO: handle exception
       e.printStackTrace();
     }finally{
       System.out.println("Race ends!");
     }
     exe.shutdown();
   }
 }

다음은 Player 클래스입니다.

import java.util.concurrent.CountDownLatch;
 
 
 public class Player implements Runnable {
 
   private int id;
   private CountDownLatch begin;
   private CountDownLatch end;
   public Player(int i, CountDownLatch begin, CountDownLatch end) {
     // TODO Auto-generated constructor stub
     super();
     this.id = i;
     this.begin = begin;
     this.end = end;
   }
 
   @Override
   public void run() {
     // TODO Auto-generated method stub
     try{
       begin.await();    // begin 0
       Thread.sleep((long)(Math.random()*100));  // , 
       System.out.println("Play"+id+" arrived.");
     }catch (InterruptedException e) {
       // TODO: handle exception
       e.printStackTrace();
     }finally{
       end.countDown();  // end 1, 0
     }
   }
 }
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기