如何优雅的判断两个线程任务同时完成

2016-07-06 22:21:48 +08:00
 BigUncleLee
1843 次点击
所在节点    问与答
9 条回复
wevsty
2016-07-06 22:29:43 +08:00
第三个任务单独开线程或者复用前两个的其中一个线程?
互斥体,信号量,事件,关键段这些手段都可以做到,自己选择一下吧。更简单点,设置变量做标志位也是可以的。
kuko126
2016-07-06 22:32:03 +08:00
如果是 java 的话可以用 CountDownLatch
BigUncleLee
2016-07-06 22:38:59 +08:00
@wevsty 感谢回复
* 单独处理并不复杂
* 如果这个扩展成这样一个需求:
* 将任务不断推送到一个 pipeline 中,并设置 taget 任务。
* 如何保证 target 在 pipeline 最后一个任务完成后,马上进行?
BigUncleLee
2016-07-06 22:40:42 +08:00
@wevsty 'target' 误打抱歉
BigUncleLee
2016-07-06 22:41:43 +08:00
@kuko126 感谢回复 ☺☺
wevsty
2016-07-06 22:43:59 +08:00
@BigUncleLee
可以自己做个队列或者链表来完成,优先处理队列中的某些任务就可以保证了
如果不想自己实现队列,考虑可能我会考虑使用事件来完成。不过还得看你的具体情况决定
BigUncleLee
2016-07-06 22:49:35 +08:00
@wevsty 感谢回复 ☺
'做个队列或者链表来完成,优先处理队列中的某些任务'
我一时没有思路 能否再解释下这句话吗 非常感谢
wevsty
2016-07-06 22:54:57 +08:00
@BigUncleLee
用链表举例好了
用一个线程维护链表,设计一个类或者结构标记任务和任务优先级,如果有新任务就加入链表。工作线程遍历链表,优先处理结构中标记为最优先的任务,然后删除链表中的这个任务就好。
如果链表数据同步很麻烦,可以考虑单独开辟链表维护线程
SoloCompany
2016-07-06 23:37:43 +08:00
CountDownLatch 适用于多任务协作和线程状态无关
如果你的自己管理的非池化线程,那么就最古老的 Thread.join 方法就可以了
thread1.join();
thread2.join();
// 这个位置的代码必然会在 thread1 和 thread2 结束后才会被执行
不仅限于 java ,应该所有支持线程的语言,都应该有 join 语句

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/290737

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX