Java中CountDownLatch和CyclicBarrier的区别
尽管CountDownLatch和CyclicBarrier都被用作同步帮助,允许至少一个线程等待,但它们之间有明显的区别。了解Java中CountDownLatch和CyclicBarrier之间的对比,将有助于你选择这些工具中的某一个为你提供更好的服务,显然这也是一个很好的Java调查问题。
CountDownLatch是一个线程在等待多个线程完成或调用 countDown()
。当所有线程都调用了 countDown()
,等待的线程继续执行。
示例代码:
运行结果:
循环障碍(CyclicBarrier)是指不同的线程互相挂起(互相等待),当所有的线程都完成了它们的执行,结果需要在父线程中进行合并。
示例代码:
运行结果:
CountDownLatch和CyclicBarrier的区别 –
倒计时锁存器 | 循环障碍 |
---|---|
CountDownLatch是一种构造,一个线程在寻找的同时,不同的线程在锁存器上进行计数,直到到达0。 | 循环屏障(CyclicBarrier)是一个可重复使用的结构,在这个结构中,一个线程的聚集在一起,直到所有的线程都出现。到那时,屏障就会被打破,可以交替进行移动。 |
CountDownLatch保持对任务的计数。 | 循环屏障(CyclicBarrier)保持着线程的数量。 |
在CountDownLatch中,单线程可以倒计时一次以上,这将减少countdown()方法被调用的次数。 | 在CyclicBarrier中,单线程可以只调用awits一次,这将使障碍计数减少一次,即使调用awits()方法超过一次。 |
当使用CountDownLatch时,你必须在创建CountDownLatch对象时指定对倒计时()方法的调用次数。 | 当使用CyclicBarrier时,你必须指定调用await()函数来跳过障碍的线程数量。 |
CountDownLatch被初始化为N,用于使一个线程待命,直到N个字符串完成某些活动,或者某些活动已经完成了N次。 | 如果有一个初始化为3的CyclicBarrier,这意味着你在任何情况下都应该有3个字符串来调用await()。 |
CountDownLatch不能被重复使用,当计数到达0时,它不能被重置。 | CyclicBarrier在持有线程被释放后可以被重新使用。 |
在CountDownLatch中,只有当前有问题的线程会抛出一个特殊情况/异常。 | 在CyclicBarrier中,如果一个线程遇到了问题(超时、中断),已经到达await()的广泛的各种线程都会得到一个特殊情况/异常。 |
CountDownLatch是可以提前的。 | CyclicBarrier是不可提前的。 |
如果当前线程被中断,它将抛出InterruptedException。它不会影响其他线程。 | 如果一个线程在等待时被打断,那么所有其他等待的线程将抛出BrokenBarrierException。 |