CountDownLatch:
- 允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。简单理解就是可以控制一个动作在指定其他动作完成之后再执行。
- 位于java.utils.concurrent包下
-
计数无法重置。 如果需要重置计数的版本,考虑使用
CyclicBarrier
。
方法介绍:
void | await() 导致当前线程等到锁存器计数到零,除非线程是 interrupted 。 |
boolean | await(long timeout, TimeUnit unit) 使当前线程等待直到锁存器计数到零为止,除非线程为 interrupted或指定的等待时间过去。 |
void | countDown() 减少锁存器的计数,如果计数达到零,释放所有等待的线程。 |
long | getCount() 返回当前计数。 |
String | toString() 返回一个标识此锁存器的字符串及其状态。 |
示例:
public class Worker {
private String name;
public Worker(String name) {
this.name = name;
}
public void doSomethine() {
System.out.println("工人" + this.name + "干活");
}
}
public class Boss {
public void check() {
System.out.println("验收");
}
}
public class CountDownLanchTest {
public static void main(String[] args) throws InterruptedException {
List<Worker> workerList = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
workerList.add(new Worker(i + ""));
}
Boss boss = new Boss();
ExecutorService executorService = Executors.newCachedThreadPool();
CountDownLatch countDownLatch = new CountDownLatch(workerList.size());
for (int i = 0; i < workerList.size(); i++) {
final int index = i;
executorService.execute(() -> {
workerList.get(index).doSomethine();
countDownLatch.countDown();
});
}
countDownLatch.await();
boss.check();
executorService.shutdown();
}
}
//输出:
工人1干活
工人3干活
工人2干活
工人5干活
工人4干活
工人6干活
工人8干活
工人7干活
工人10干活
工人9干活
验收
boss的能在工人都干完活之后再进去验收。.