1、介绍
CyclicBarrier和CountDownLatch一样,都是为了控制多个线程等待达到某个时间的时候再继续进行后续的任务。
不同点:
-
1、CountDownLatch不能循环使用,第一次有效,后续的使用都无效了,而CyclicBarrier却可以循环使用
-
2、CountDownLatch是一组线程await等待另一组线程都countDown之后,自己再继续处理自己的任务,次数countDown所在线程没有任何影响,调用countDown之后,继续执行后续的任务。而CyclicBarrier只有一组线程,大家都执行await方法,await的数量达到后,唤醒所有线程,继续后续处理。
注意:在使用线程池时,必须保证await的线程达到设定值,否则会造成死锁。
2、代码
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
/**
* CyclicBarrier就像在线程前面设置了一个战壕,等待所有军力到齐后,在一起冲锋
* 而
* CountDownLatch是一组线程await,另一组线程countDown数量达到后,唤醒await线程
* 并且还不能循环使用
*
* [@Author](https://my.oschina.net/arthor) liufu
* [@Company](https://my.oschina.net/u/3478402) 任子行网络技术股份有限公司
* @CreateTime 2018/3/23 10:26
*/
public class CyclicBarrierTest {
public static void main(String[] args) {
//这是一个战壕,等待够三个军的兵力,一起向前冲
CyclicBarrier barrier = new CyclicBarrier(3);
new Thread(new Runnable() {
[@Override](https://my.oschina.net/u/1162528)
public void run() {
try {
System.out.println("报告,第一军到达!");
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("全线出击,兄弟们冲啊!");
}
}).start();
new Thread(new Runnable() {
[@Override](https://my.oschina.net/u/1162528)
public void run() {
try {
System.out.println("报告,第二军到达!");
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("全线出击,兄弟们冲啊!");
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
System.out.println("报告,由于鬼子炸了桥梁,我第三军延迟到达!");
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("全线出击,兄弟们冲啊!");
}
}).start();
}
}
本文详细比较了Java并发编程中CyclicBarrier与CountDownLatch的使用场景与区别。CyclicBarrier可循环使用,适用于一组线程等待全部就绪后再同时执行的情况;而CountDownLatch仅能使用一次,适合一组线程等待另一组线程完成特定数量的操作。

6497

被折叠的 条评论
为什么被折叠?



