public class CountDownLatch extends Object
一个CountDownLatch
与给定数初始化。的await
方法块直到当前计数达到零的countDown()
方法调用,之后,所有等待的线程,释放任何后续的调用await
立即返回。这是一一个镜头的现象-计数不能被重置。如果你需要一个版本,重置计数,考虑使用CyclicBarrier
。
一个CountDownLatch
是一种通用的同步工具,可以用于许多用途。一个CountDownLatch
初始化计算的一个作为一个简单的开/关锁,门:所有线程调用await
在门口等候直到它被一个线程调用countDown()
打开。一个CountDownLatch
初始化n可以用来使一个线程等待直到n个线程完成一些动作,或一些行动已经完成N次。
一个CountDownLatch
是一个有用的特性,它不需要线程countDown
等待计数达到零之前,它只是防止任何线程进行过await
直到所有的线程可以通过。
示例用法:这里是对类的一组线程使用两倒计时锁:
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() { ... }
}
另一个典型的用法是将一个问题分成n份,与运行,执行部分和计数下降对锁描述每个部分,和队列的runnable对象给执行者。当所有的子部件都完成后,协调线程将能够通过等待。(当线程必须反复倒在这条路上,而不是使用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()
happen-before行动从另一个线程中的相应的await()
成功返回前一个线程的行为。
Constructor and Description |
---|
CountDownLatch(int count)
构建了一个
CountDownLatch 与给定的计数初始化。
|
Modifier and Type | Method and Description |
---|---|
void |
await()
使当前线程等待直到锁向下计数为零,除非线程
interrupted。
|
boolean |
await(long timeout, TimeUnit unit)
使当前线程等待直到锁向下计数为零,除非线程
interrupted,或指定的等待时间的流逝。
|
void |
countDown()
减少锁的数量,释放所有等待的线程,如果计数为零。
|
long |
getCount()
返回当前计数。
|
String |
toString()
返回一个识别该锁存器的字符串,以及它的状态。
|
public CountDownLatch(int count)
CountDownLatch
与给定的计数初始化。
count
-次
countDown()
数必须调用之前调用的线程可以通过
await()
IllegalArgumentException
-如果
count
是负的
public void await() throws InterruptedException
如果当前的计数为零,则此方法将立即返回。
如果当前的计数大于零,那么当前的线程将被禁用的线程调度的目的,并处于休眠状态,直到两个事情发生:
countDown()
方法调用;或如果当前线程:
InterruptedException
投入和当前线程的中断状态被清除。
InterruptedException
-如果当前线程中断等待
public boolean await(long timeout, TimeUnit unit) throws InterruptedException
如果当前计数为零,那么这个方法立即返回的值true
。
如果当前的计数大于零,那么当前的线程将被禁用的线程调度的目的,并处于休眠状态,直到三个事情发生:
countDown()
方法调用;或如果计数达到零则该方法返回的值true
。
如果当前线程:
InterruptedException
投入和当前线程的中断状态被清除。
如果指定的等待时间的流逝,然后false
返回值。如果时间小于或等于零,该方法将不会等待在所有。
timeout
-最大等待时间
unit
的
timeout
争论的时间单位
true
如果计数达到零,
false
如果等待的时间才达到零计数
InterruptedException
-如果当前线程中断等待
public void countDown()
如果当前计数大于零则递减。如果新的计数为零,那么所有的等待线程都重新启用了线程调度的目的。
如果当前的计数等于零,那么什么都没有发生。
public long getCount()
此方法通常用于调试和测试目的。
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.