首页 > 试题广场 >

当我们需要所有线程都执行到某一处,才进行后面的的代码执行我们

[单选题]
当我们需要所有线程都执行到某一处,才进行后面的的代码执行我们可以使用?
  • CountDownLatch
  • CyclicBarrier
  • Semaphore
  • Future
从jdk作者设计的目的来看,javadoc是这么描述它们的: CountDownLatch: A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes. CyclicBarrier : A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point. 从javadoc的描述可以得出: CountDownLatch:一个或者多个线程,等待其他多个线程完成某件事情之后才能执行; CyclicBarrier:多个线程互相等待,直到到达同一个同步点,再继续一起执行。 对于CountDownLatch来说,重点是“一个线程(多个线程)等待”,而其他的N个线程在完成“某件事情”之后,可以终止,也可以等待。 而对于CyclicBarrier,重点是多个线程,在任意一个线程没有完成,所有的线程都必须互相等待,然后继续一起执行。 CountDownLatch是计数器,线程完成一个记录一个,只不过计数不是递增而是递减,而CyclicBarrier更像是一个阀门,需要所有线程都到达,阀门才能打开,然后继续执行。 按照这个题目的描述等所有线程都到达了这一个阀门处,再一起执行,此题强调的是,一起继续执行,我认为 选B 比较合理!
编辑于 2019-08-26 17:46:29 回复(13)
CountDownLatch 是等待一组线程执行完,才执行后面的代码。此时这组线程已经执行完。
CyclicBarrier 是等待一组线程至某个状态后再同时全部继续执行线程。此时这组线程还未执行完。
本人也是选B,如果选A的话,难道是因为题目要求执行的是后面的代码?而不是继续执行线程?
发表于 2019-06-27 15:45:55 回复(9)
CountDownLatch:老师要等所有学生来教室了才能讲课(这种等待只与老师有关,与学生无关,因为他们到教室后不需要等谁就可以做自己的事情)。
    流程:首先给CountDownLatch对象设置一个count。老师await(),每个学生来了都要CountDown()一下把count减一,所有学生都CountDown()完了count也就等于0了,这时老师await()结束(CountDownLatch对象本身根据count判断await()结束与否,程序员无须自己判断),然后才能开始上课。
CyclicBarrier:无论老师、学生都要等其他人到教室了才能做自己的事,否则老师不能讲课,学生也不能自顾自的做自己的事(都得等着)。
    流程首先给CyclicBarrier对象设置一个sum。每个人就位后就await()等待其他人,同时CyclicBarrier对象也获知新增一个人在await()了,当最后一个人也await()时,CyclicBarrier对象就知道所有人都到齐了(通过内部与事先设定的人数sum比较得知)。然后它一声令下:“人都到齐了,各干各的吧!”,然后所有人才接着各忙各的。
编辑于 2020-11-03 18:27:18 回复(10)

CountDownLatch 允许一个线程或多个线程等待特定情况,同步完成线程中其他任务。举例:百米赛跑,就绪运动员等待发令枪发动才能起步。
CyclicBarrier 和CountDownLatch一样都可以协同多个线程,让指定数量的线程等待期他所有的线程都满足某些条件之后才继续执行。举例:排队上摩天轮时,每到齐四个人,就可以上同一个车厢。

发表于 2019-08-12 12:45:33 回复(7)

这道题有大佬能解答一下吗,为啥我觉得想选B...


发表于 2019-06-02 10:16:20 回复(5)
我觉的是B,在csdn看到的countDownLatch和cyclicBarrier的形象比喻,就是在百米赛跑的比赛中若使用 countDownLatch的话冲过终点线一个人就给评委发送一个人的成绩,10个人比赛发送10次,如果用CyclicBarrier,则只在最后一个人冲过终点线的时候发送所有人的数据,仅仅发送一次,这就是区别。

发表于 2019-06-30 18:40:14 回复(4)
A.CountDownLatch 是等待一组线程执行完,才执行后面的代码。此时这组线程已经执行完。
B..CyclicBarrier 是等待一组线程至某个状态后再同时全部继续执行线程。此时这组线程还未执行完。
C.Semaphore 通常我们叫它信号量, 可以用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用资源。
D.future表示一个可能还没有完成的异步任务的结果,针对这个结果可以添加Callback以便在任务执行成功或失败后作出相应的操作。
发表于 2021-03-17 16:48:29 回复(2)
跑步比赛,所有选手要在同一起跑线等待,选手齐了才可以开跑,这就是CyclicBarrier;而在比赛终点,要所有选手越过终点之后,比赛才算正式结束,这就是CountDownLatch。
我觉得得看怎么理解“后面的代码”指什么,如果“后面的代码”指的是阻塞等待的线程(执行await的当前线程),那就是选A;如果“后面的代码”值的是所有每个线程各自后面的代码,那就是选B。
发表于 2019-08-12 23:56:25 回复(0)

CountDownLatch 和 CyclicBarrier 的区别

  • CountDownLatch的作用是允许一个或多个线程等待其他线程完成执行;CyclicBarrier则允许多个线程相互等待。
  • CountDownLatch的计数器无法被重置;CyclicBarrier的计数器可以被重置。
发表于 2019-11-21 11:10:02 回复(0)
CyclicBarrier:只有集齐7颗龙珠才能召唤神龙
发表于 2022-05-11 20:00:32 回复(0)
CountDownLatch : 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行。
CyclicBarrier: N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。
这样应该就清楚一点了,对于CountDownLatch来说,重点是那个“一个线程”, 是它在等待, 而另外那N的线程在把“某个事情”做完之后可以继续等待,可以终止。
而对于CyclicBarrier来说,重点是那N个线程,他们之间任何一个没有完成,所有的线程都必须等待。
CountDownLatch 是计数器, 线程完成一个就记一个, 就像 报数一样, 只不过是递减的。
而CyclicBarrier更像一个水闸, 线程执行就想水流, 在水闸处都会堵住, 等到水满(线程到齐)了, 才开始泄流。
发表于 2020-05-04 14:37:29 回复(0)
有没有大佬讲下 Semaphore 和 Future 。。。😥
发表于 2020-06-09 16:36:18 回复(0)
这里看题意所有线程都执行到某一处,才进行后面的代码执行个人认为重点是后面两个字。CountDownLatch 是等待一组线程执行完,才执行后面的代码。CyclicBarrier 是等待一组线程至某个状态后再同时全部继续执行线程。所以A是对的。
发表于 2019-08-28 16:50:01 回复(1)
这里应该是区分职责:countDownLatch是区分职责的,而CycilicBarrier线程所有的职责都是一样的。题目中没有说是同一种职责,应该选A,两种本来就很相似。
发表于 2019-07-20 20:59:38 回复(0)
个人觉得此题应该选B
题中说“所有线程都执行到某一处”即说明了所有线程之间是相互等待的,当所有线程满足条件之后才执行,这明显属于CyclicBarrier的应用场景,而CountDownLatch是使用在一个或多个线程等待其他线程完成之后才继续往下执行
发表于 2019-06-27 14:49:07 回复(1)
CyclicBarrier……
刚刚从不会抛出InterruptedException异常题目那里过来,看到有热心网友贴出了关于这一个类的说明,大致说了它是让所有线程都执行到
同一处再进行后面的操作,是个要么全干要么全不干的“狠角色”,不知道这么理解对不对,请多多指教哈!

发表于 2019-06-27 13:42:13 回复(0)
转:
java并发编程中涉及的CountDownLatch和CyclicBarrier两者的区别
CountDownLatch : 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行。
 CyclicBarrier: N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。
CountDownLatch:老师要等所有学生来教室了才能讲课(这种等待只与老师有关,与学生无关,因为他们到教室后不需要等谁就可以做自己的事情)。
    流程:首先给CountDownLatch对象设置一个count。老师await(),每个学生来了都要CountDown()一下把count减一,所有学生都CountDown()完了count也就等于0了,这时老师await()结束(CountDownLatch对象本身根据count判断await()结束与否,程序员无须自己判断),然后才能开始上课。
CyclicBarrier:无论老师、学生都要等其他人到教室了才能做自己的事,否则老师不能讲课,学生也不能自顾自的做自己的事(都得等着)。
    流程首先给CyclicBarrier对象设置一个sum。每个人就位后就await()等待其他人,同时CyclicBarrier对象也获知新增一个人在await()了,当最后一个人也await()时,CyclicBarrier对象就知道所有人都到齐了(通过内部与事先设定的人数sum比较得知)。然后它一声令下:“人都到齐了,各干各的吧!”,然后所有人才接着各忙各的。
发表于 2023-06-09 10:08:54 回复(0)
CountDownLatch: 相当于n个线程百米赛跑,跑完了就减1(调用了CountDown()方法) , 直到都跑到终点, 变成0 
CyclicBarrier:相当于n个线程被圈禁了, 等待所有线程到达才能推开牢门,一起逃出去 。

发表于 2021-04-24 22:56:14 回复(0)
我也是选的b
发表于 2020-12-07 20:29:18 回复(0)
其实都没用过。 conutdownlatch是所有人到某处,然后执行。 cycle是等线程达到特定状态,才执行。
发表于 2020-08-04 08:19:09 回复(0)