CountDownLatch和CyclicBarrier简介

目录

CountDownLatch

CyclicBarrier同步屏障

两者的区别


CountDownLatch

CountDownLatch和join的功能类似,也就是让一个线程等待其他线程都执行完,再执行后续的内容。但是功能更多。

CountDownLatch的构造函数里面传入一个int变量作为计数器的值,表示等待N个点完成。这N个点可以放在不同线程里表示等待着N各线程的完成,也可以放在一个线程的不同位置,表示等待不同步骤的完成。然后在每个点放置CountDownLatch的countDown(),每执行一次计数器减1(如果要在多线程调用这个,只需要把CountDownLatch对象的引用传入这个线程的构造函数),CountDownLatch的await()在计数器为0之前,会阻塞调用它的线程。当然调用await的时候也可以传入一个timeout的参数,只等待固定的时间。


CyclicBarrier同步屏障

Cyclic表示循环的、可重复使用的,barrier表示屏障,他做的事是:当一个线程到达屏障点时,会被阻塞,直到最后一个线程到达屏障点时,所有的屏障才会开门,所有的线程才能继续运行。

可以在构造函数里面设置一个int型变量表示设置的同步屏障的个数,然后每个线程同样调用await()在此阻塞,等待最后一个线程到达屏障点。此外,构造函数里面还可以传入一个线程barrierAction,用于在所有线程到达屏障时优先执行barrierAction的内容。

这个的应用场景是:比如要其他的线程首先计算各自的账单,最后计算总账单的平均数,就可以创建很多个线程先计算各自的账单,计算完之后遇到await()等待,直到最后一个线程遇到await()之后,立马执行计算平均数的线程。


两者的区别

CountDownLatch是一次性的,只能使用一次。CyclicBarrier可以重复使用,调用它的reset()之后就会重置,因此CyclicBarrier可以用于更复杂的业务场景。比如CyclicBarrier还提供方法来获得当前阻塞的线程个数。

此外,CountDownLatch是一个线程等待多个线程执行完成,但是CyclicBarrier是多个线程等待所有线程执行完。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值