JavaTM Platform
Standard Ed. 6

java.util.concurrent
클래스 CountDownLatch

java.lang.Object 
  상위를 확장 java.util.concurrent.CountDownLatch


public class CountDownLatch
extends Object

다른 thread로 실행중의 조작 세트가 완료할 때까지, 1 개(살) 이상의 thread를 대기 가능하게 하는 동기화 지원 기능입니다.

CountDownLatch 는, 지정된 「카운트」를 사용해 초기화됩니다. await 메소드는,countDown() 메소드의 호출의 결과로서, 현재의 카운트가 제로에 이를 때까지 블록 합니다. 그 후, 대기중의 thread가 모두 해제되어 후속의 await 의 호출이 곧바로 돌려주어집니다. 이것은 단발적인 현상이며, 카운트를 리셋 할 수 없습니다. 카운트를 리셋 하는 버젼이 필요한 경우는,CyclicBarrier 의 사용을 고려해 주세요.

CountDownLatch 는, 다양한 목적으로 사용할 수 있는 유연성의 높은 동기 툴입니다. 카운트 1 으로 초기화된 CountDownLatch 는, 단순한 온/오프의 빗장, 즉 게이트로서 기능합니다. await 를 호출하는 thread는 모두,countDown() 를 호출하는 thread에 의해 유효하게 될 때까지 게이트로 대기합니다. N 에 초기화된 CountDownLatch 를 사용하면(자),N 개의 thread가 액션을 완료하는지, 액션이 N 회완료할 때까지, 어느 thread를 대기시킬 수가 있습니다.

CountDownLatch 의 특성으로 유용한 것은,countDown 를 호출하는 thread가, 카운트가 제로에 이를 때까지 처리를 대기할 필요가 없는 것입니다. 이것은, 단순하게 모든 thread가 패스할 때까지, 어느 thread도 await 를 빠지지 않게 합니다.

사용예는 다음과 같습니다. 다음에 나타내는 클래스의 페어에서는, 워커 thread의 그룹이 다음의 2 개의 카운트다운 빗장을 사용합니다.

 class Driver { // ...
   void main() throws InterruptedException {
     CountDownLatch startSignal = new CountDownLatch(1);
     CountDownLatch doneSignal = new CountDownLatch(N);

     for (int i = 0; i < N; ++i) // create and start threads
       new Thread(new Worker(startSignal, doneSignal)). start();

     doSomethingElse();            // don't let run yet
     startSignal.countDown();      // let all threads proceed
     doSomethingElse();
     doneSignal.await();           // wait for all to finish
   }
 }

 class Worker implements Runnable {
   private final CountDownLatch startSignal;
   private final CountDownLatch doneSignal;
   Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
      this.startSignal = startSignal;
      this.doneSignal = doneSignal;
   }
   public void run() {
      try {
        startSignal.await();
        doWork();
        doneSignal.countDown();
      } catch (InterruptedException ex) {} // return;
   }

   void doWork() { ... }
 }

 

이제(벌써) 1 개의 표준적인 사용법은, 문제를 N 개의 부분에 분할해, 각부를 실행해 빗장을 카운트다운 하는 Runnable 를 사용해 각 부분을 기술해, 모든 Runnable 를 executor 의 큐에 넣는 방법입니다. 하위 부분이 모두 완료하면(자), 조정역의 thread는 await 를 빠질 수가 있습니다. 이 방법으로 thread가 카운트다운을 반복해 실행할 필요가 있는 경우는, 대신에 CyclicBarrier 를 사용해 주세요.

 class Driver2 { // ...
   void main() throws InterruptedException {
     CountDownLatch doneSignal = new CountDownLatch(N);
     Executor e = ...

     for (int i = 0; i < N; ++i) // create and start threads
       e.execute(new WorkerRunnable(doneSignal, i));

     doneSignal.await();           // wait for all to finish
   }
 }

 class WorkerRunnable implements Runnable {
   private final CountDownLatch doneSignal;
   private final int i;
   WorkerRunnable(CountDownLatch doneSignal, int i) {
      this.doneSignal = doneSignal;
      this.i = i;
   }
   public void run() {
      try {
        doWork(i);
        doneSignal.countDown();
      } catch (InterruptedException ex) {} // return;
   }

   void doWork() { ... }
 }

 

메모리 무결성 효과:countDown() 를 호출하기 전의 thread내의 액션은, 다른 thread내의 대응하는 await() 로부터 정상적으로 복귀한 뒤의 액션보다 happen-before 입니다.

도입된 버젼:
1.5

생성자 의 개요
CountDownLatch (int count)
          지정된 카운트로 초기화된 CountDownLatch 를 구축합니다.
 
메소드의 개요
 void await ()
          thread로인터럽트가 발생하지 않는 한, 빗장의 카운트다운이 제로가 될 때까지 현재의 thread를 대기시킵니다.
 boolean await (long timeout, TimeUnit  unit)
          thread로인터럽트가 발생하는지, 지정된 대기 시간이 경과하지 않는 한, 빗장의 카운트다운이 제로가 될 때까지 현재의 thread를 대기시킵니다.
 void countDown ()
          빗장의 카운트를 감산해, 카운트가 제로에 이르면(자) 대기중의 thread를 모두 해제합니다.
 long getCount ()
          현재의 카운트를 돌려줍니다.
 String toString ()
          빗장 및 그 상태를 식별하는 캐릭터 라인을 돌려줍니다.
 
클래스 java.lang. Object 로부터 상속된 메소드
clone , equals , finalize , getClass , hashCode , notify , notifyAll , wait , wait , wait
 

생성자 의 상세

CountDownLatch

public CountDownLatch(int count)
지정된 카운트로 초기화된 CountDownLatch 를 구축합니다.

파라미터:
count - thread가 await() 를 빠지기 전에,countDown() 를 호출하는 회수
예외:
IllegalArgumentException - count 가 0 보다 작은 값의 경우
메소드의 상세

await

public void await()
           throws InterruptedException 
thread로인터럽트가 발생하지 않는 한, 빗장의 카운트다운이 제로가 될 때까지 현재의 thread를 대기시킵니다.

현재의 카운트가 제로의 경우, 이 메소드는 즉시 복귀합니다.

현재의 카운트가 제로보다 큰 경우, 현재의 thread는 thread의 스케줄링에 관해서 무효가 되어, 다음의 2 개중 한쪽이 일어날 때까지 대기합니다.

현재의 thread로,

InterruptedException 가 throw 되어 현재의 thread의 인터럽트 상태가 클리어 됩니다.

예외:
InterruptedException - 대기중에 현재의 thread로 인터럽트가 발생했을 경우

await

public boolean await(long timeout,
                     TimeUnit  unit)
              throws InterruptedException 
thread로인터럽트가 발생하는지, 지정된 대기 시간이 경과하지 않는 한, 빗장의 카운트다운이 제로가 될 때까지 현재의 thread를 대기시킵니다.

현재의 카운트가 제로의 경우, 이 메소드는 즉시 값 true 로 복귀합니다.

현재의 카운트가 제로보다 큰 경우, 현재의 thread는 thread의 스케줄링에 관해서 무효가 되어, 다음의 3 개중 한쪽이 일어날 때까지 대기합니다.

카운트가 제로에 이르면(자), 메소드는 값 true 로 복귀합니다.

현재의 thread로,

InterruptedException 가 throw 되어 현재의 thread의 인터럽트 상태가 클리어 됩니다.

지정된 대기 시간이 경과하면(자), 값 false 가 돌려주어집니다. 시간이 제로 또는 그것보다 작은 경우, 메소드는 대기하지 않습니다.

파라미터:
timeout - 대기하는 최장 시간
unit - timeout 인수의 시간 단위
반환값:
카운트가 제로에 이르렀을 경우는 true, 카운트가 제로에 이르기 전에 대기 시간이 경과했을 경우는 false
예외:
InterruptedException - 대기중에 현재의 thread로 인터럽트가 발생했을 경우

countDown

public void countDown()
빗장의 카운트를 감산해, 카운트가 제로에 이르면(자) 대기중의 thread를 모두 해제합니다.

현재의 카운트가 제로보다 큰 경우, 값이 줄여집니다. 새로운 카운트가 제로의 경우, 대기중의 모든 thread의 스케줄링이 다시 가능하게 됩니다.

현재의 카운트가 제로의 경우, 아무것도 행해지지 않습니다.


getCount

public long getCount()
현재의 카운트를 돌려줍니다.

일반적으로, 이 메소드는 디버그 및 테스트 목적으로 사용합니다.

반환값:
현재의 카운트

toString

public String  toString()
빗장 및 그 상태를 식별하는 캐릭터 라인을 돌려줍니다. 상태는 괄호로 둘러싸여 캐릭터 라인「Count =」 에 이어 현재의 카운트가 포함됩니다.

오버라이드(override):
클래스 Object 내의 toString
반환값:
이 빗장 및 그 상태를 식별하는 캐릭터 라인

JavaTM Platform
Standard Ed. 6

버그의 보고와 기능의 요청
한층 더 자세한 API 레퍼런스 및 개발자 문서에 대해서는,Java SE 개발자용 문서를 참조해 주세요. 개발자전용의 상세한 해설, 개념의 개요, 용어의 정의, 버그의 회피책, 및 코드 실례가 포함되어 있습니다.

Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.