|
JavaTM Platform Standard Ed. 6 |
|||||||||
앞의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요: 상자 | 필드 | 생성자 | 메소드 | 상세: 필드 | 생성자 | 메소드 |
java.lang.Objectjava.util.concurrent.CountDownLatch
public class CountDownLatch
다른 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 입니다.
생성자 의 개요 | |
---|---|
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 |
생성자 의 상세 |
---|
public CountDownLatch(int count)
CountDownLatch
를 구축합니다.
count
- thread가 await()
를 빠지기 전에,countDown()
를 호출하는 회수
IllegalArgumentException
- count
가 0 보다 작은 값의 경우메소드의 상세 |
---|
public void await() throws InterruptedException
현재의 카운트가 제로의 경우, 이 메소드는 즉시 복귀합니다.
현재의 카운트가 제로보다 큰 경우, 현재의 thread는 thread의 스케줄링에 관해서 무효가 되어, 다음의 2 개중 한쪽이 일어날 때까지 대기합니다.
countDown()
메소드의 호출에 의해, 카운트가 제로에 이른다
현재의 thread로,
InterruptedException
가 throw 되어 현재의 thread의 인터럽트 상태가 클리어 됩니다.
InterruptedException
- 대기중에 현재의 thread로 인터럽트가 발생했을 경우public boolean await(long timeout, TimeUnit unit) throws InterruptedException
현재의 카운트가 제로의 경우, 이 메소드는 즉시 값 true
로 복귀합니다.
현재의 카운트가 제로보다 큰 경우, 현재의 thread는 thread의 스케줄링에 관해서 무효가 되어, 다음의 3 개중 한쪽이 일어날 때까지 대기합니다.
countDown()
메소드의 호출에 의해, 카운트가 제로에 이른다
카운트가 제로에 이르면(자), 메소드는 값 true
로 복귀합니다.
현재의 thread로,
InterruptedException
가 throw 되어 현재의 thread의 인터럽트 상태가 클리어 됩니다.
지정된 대기 시간이 경과하면(자), 값 false
가 돌려주어집니다. 시간이 제로 또는 그것보다 작은 경우, 메소드는 대기하지 않습니다.
timeout
- 대기하는 최장 시간unit
- timeout
인수의 시간 단위
true
, 카운트가 제로에 이르기 전에 대기 시간이 경과했을 경우는 false
InterruptedException
- 대기중에 현재의 thread로 인터럽트가 발생했을 경우public void countDown()
현재의 카운트가 제로보다 큰 경우, 값이 줄여집니다. 새로운 카운트가 제로의 경우, 대기중의 모든 thread의 스케줄링이 다시 가능하게 됩니다.
현재의 카운트가 제로의 경우, 아무것도 행해지지 않습니다.
public long getCount()
일반적으로, 이 메소드는 디버그 및 테스트 목적으로 사용합니다.
public String toString()
「Count =」
에 이어 현재의 카운트가 포함됩니다.
Object
내의 toString
|
JavaTM Platform Standard Ed. 6 |
|||||||||
앞의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요: 상자 | 필드 | 생성자 | 메소드 | 상세: 필드 | 생성자 | 메소드 |
Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.