|
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 도 참조해 주세요.