1. 定义
CountDownLatch提供了一个栅栏,在这个栅栏这里有n个线程等待另外m个线程完成任务的一个组件。
CyclicBarrier提供了一个屏障,保证n个线程全部到达这个屏障之后,再继续执行后续的代码。
2. 对比
- 二者语义有所不同,CountDownLatch提供的n个线程等待m个线程的组件,而CyclicBarrier提供的是一个对n个线程进行步调调整的组件。
- CountDownLatch使用更加简单,灵活,可以在一个线程中多次countDown,CyclicBarrier不支持。
- CountDownLatch的计数器不支持重置,CyclicBarrier支持。
- CyclicBarrier提供barrierAction,在线程全部到达后,立即执行这一任务,CountDownLatch不支持
3. 应用场景
CountDownLatch常用于主线程等待多个子线程执行任务完成,然后进行下一步操作。
CyclicBarrier可以提供一种简易的,轻量的类MapReduce操作,可以手动分配(map)任务给线程池,然后用barrierAction(reduce)来处理多个线程的执行结果。
4. Demo
CountDownLatch:
package org.lyh;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorServic