![]() |
1
131
一个主要的区别是 CyclicBarrier 接受一个(可选)可运行任务,该任务在满足公共屏障条件后运行。 它还允许您获取在屏障处等待的客户机数量和触发屏障所需的数量。一旦触发,屏障将重置并可再次使用。 对于简单的用例-服务启动等。。。倒计时可以。循环载体对于更复杂的协调任务很有用。这类事情的一个例子是并行计算——其中有多个子任务参与计算——类似于 MapReduce . |
|
2
125
还有另一个区别。
当使用
当使用
“你为什么要那样做?”,你可以说。想象一下,您正在使用一个由执行回调的其他人编写的神秘API。您希望其中一个线程等待某个回调被调用多次。您不知道将调用回调的线程。在这种情况下,a
我只是希望
|
![]() |
3
40
有一点还没有人提到,在
|
![]() |
4
22
我认为JavaDoc已经明确地解释了这些差异。 大多数人都知道倒计时锁不能重置,然而,CyclicBarrier可以。但这并不是唯一的区别,或者可以将CyclicBarrier重命名为resetblecountdownlock。 我们应该从JavaDoc中描述的目标的角度来区分这些差异 倒计时闩锁: 一种同步辅助程序,允许一个或多个线程等待在其它线程中执行的一组操作完成。 自行车承运人: 一种同步辅助程序,允许一组线程相互等待到达一个公共的屏障点。 在倒计时锁存中,有一个或多个线程正在等待一组 其他线程 完成。在这种情况下,有两种类型的线程,一种类型正在等待,另一种类型正在执行某些操作,在完成任务后,它们可能正在等待或刚刚终止。 在CyclicBarrier中,只有一种线程,它们彼此等待,彼此相等。 |
![]() |
5
14
主要的区别记录在Javadocs for countdownlock中。即:
来源 1.6 Javadoc |
![]() |
6
12
倒计时锁存器用于一次性同步。在使用CountDownLatch时,任何线程都可以根据自己的喜好多次调用countDown()。调用await()的线程将被阻止,直到计数达到零,因为其他未阻止的线程调用了countDown()。这个 javadoc for CountDownLatch 国家:
相反,循环屏障用于多个同步点,例如,如果一组线程正在运行循环/阶段计算,并且需要在开始下一个迭代/阶段之前进行同步。根据 javadoc for CyclicBarrier :
与CountDownLatch不同,对await()的每个调用都属于某个阶段,可能导致线程阻塞,直到属于该阶段的所有方都调用了await()。CyclicBarrier不支持显式的countDown()操作。 |
![]() |
7
12
这个问题已经得到了充分的回答,但是我想我可以通过发布一些代码来增加一些价值。 为了说明循环势垒的行为,我制作了一些示例代码。障碍物一倾斜,就 自动 重新设置以便可以再次使用(因此它是“循环的”)。运行程序时,请注意只有在障碍物倾斜后才会触发打印输出“让我们玩”。
|
![]() |
8
7
当我研究闩锁和自行车运载器时,我想到了这个比喻。 循环载体 :假设一家公司有一个会议室。为了开始会议,一定数量的与会者必须参加会议(使之正式)。以下是正常会议与会者(员工)的代码
员工参加会议,等待其他人来开会。如果会议取消了,他也会退出:那么我们有老板怎么不喜欢等别人出现,如果他松开病人,他就取消会议。
在正常的一天,员工来开会等其他人来,如果有人不来,他们就得无限期地等待!在某个特别会议上,老板来了,他不喜欢等。(5个人需要开始开会,但只有老板来,还有一个热情的员工),所以他(生气地)取消了会议
输出:
另一种情况是另一个外部线程(地震)取消会议(调用重置方法)。在这种情况下,所有等待的线程都会被异常唤醒。
运行代码将导致有趣的输出:
您也可以在会议室中添加一名秘书,如果召开会议,她将记录所有事情,但她不是会议的一部分:
闩锁 :如果愤怒的老板想为公司客户举办展览,每件事都需要做好准备(资源)。我们为每个工人(线程)提供了一个待办事项列表,我们检查了待办事项列表(一些工人进行喷漆,另一些准备音响系统…)。当待办事项列表中的所有项目都完成(提供了资源)时,我们可以向客户敞开大门。
工人们如何准备展览:
|
![]() |
9
6
一言以蔽之 ,只是为了理解 功能性 两者的区别:
和
当然,除了非阻塞、定时等待、诊断和以上答案中详细说明的所有功能之外。 然而,在所提供的功能内,上述类是完全功能性的,并且与它们对应的名称相同。
另一方面,
|
|
10
4
在CyclicBarrier的情况下,只要所有子线程开始调用barrier.await(),Runnable就在barrier中执行。每个子线程中的barrier.await将花费不同长度的时间来完成,并且它们都在同一时间完成。 |
![]() |
11
4
一个明显的区别是,只有N个线程可以在一个周期中等待N的CyclicBarrier的释放。但在N的倒计时锁存器上可以等待无限数量的线程。倒计时递减可以由一个线程N次或N个线程每次或组合进行。 |
|
12
3
在 倒计时锁 ,主线程等待其他线程完成其执行。在 篱栅 ,工作线程等待对方完成其执行。 不能重复使用 倒计时锁 另一方面,实例一旦计数达到零并且闩锁打开 篱栅 一旦屏障被破坏,可通过重置屏障重新使用。 |
![]() |
13
1
countdownlock是任何事物的倒计时;CyclicBarrier是线程的倒计时 假设有5个工作线程和一个shipper线程,当工作线程生成100个项目时,shipper将把它们发送出去。 对于倒计时锁,计数器可以在工人或物品上 对于CyclicBarrier,计数器只能针对工人 如果工人睡不着觉,物品倒计时锁,发货人可以发货;但是,使用CyclicBarrier,发货人永远不能被调用 |
![]() |
14
0
@Kevin Lee和@Jon我尝试了使用可选Runnable的CyclicBarrier。看起来它是在自行车运输机倾斜后开始运行的。这是代码和输出 静态循环载流子屏障;
输出
|