java多线程系列8 高级同步工具(2)CountDownLatch

CountDownLatch,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,

计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,

然后在闭锁上等待的线程就可以恢复执行任务。  

应用场景:多个线程同时工作,然后其中几个可以随意并发执行,但有一个线程需要等其他线程工作结束后,才能开始。

举个例子,开启多个线程分块处理很多数据,每个线程只处理一部分,最后由另外一个线程来汇总,

那么这时候我们可以考虑使用CountDownLatch来控制并发。

public class CountDownTest implements Runnable {
	static CountDownLatch countDownLatch = new CountDownLatch(3);

	@Override
	public void run() {
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName() + " 完成一部分");
		countDownLatch.countDown();
	}

	public static void main(String[] args) {

		CountDownTest t = new CountDownTest();
		ExecutorService srev = Executors.newCachedThreadPool();
		for (int i = 0; i < 3; i++) {
			srev.submit(t);
		}
		try {
			countDownLatch.await(); // 及时通知
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("汇总完成");

	}
}

  运行结果如下    await() 后面的代码只有countDown() 到0 才会执行

     

原文地址:https://www.cnblogs.com/javabigdata/p/6905424.html