V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
BigUncleLee
V2EX  ›  问与答

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

  •  
  •   BigUncleLee · 2016-07-06 22:21:48 +08:00 · 1845 次点击
    这是一个创建于 3097 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 两个线程的任务都耗时 时间不定。
    • 现在有第三个任务 需要在两个线程都完成之后马上开始。
    • 如何优雅的实现?
    9 条回复    2016-07-06 23:37:43 +08:00
    wevsty
        1
    wevsty  
       2016-07-06 22:29:43 +08:00   ❤️ 1
    第三个任务单独开线程或者复用前两个的其中一个线程?
    互斥体,信号量,事件,关键段这些手段都可以做到,自己选择一下吧。更简单点,设置变量做标志位也是可以的。
    kuko126
        2
    kuko126  
       2016-07-06 22:32:03 +08:00   ❤️ 1
    如果是 java 的话可以用 CountDownLatch
    BigUncleLee
        3
    BigUncleLee  
    OP
       2016-07-06 22:38:59 +08:00
    @wevsty 感谢回复
    * 单独处理并不复杂
    * 如果这个扩展成这样一个需求:
    * 将任务不断推送到一个 pipeline 中,并设置 taget 任务。
    * 如何保证 target 在 pipeline 最后一个任务完成后,马上进行?
    BigUncleLee
        4
    BigUncleLee  
    OP
       2016-07-06 22:40:42 +08:00
    @wevsty 'target' 误打抱歉
    BigUncleLee
        5
    BigUncleLee  
    OP
       2016-07-06 22:41:43 +08:00
    @kuko126 感谢回复 ☺☺
    wevsty
        6
    wevsty  
       2016-07-06 22:43:59 +08:00   ❤️ 1
    @BigUncleLee
    可以自己做个队列或者链表来完成,优先处理队列中的某些任务就可以保证了
    如果不想自己实现队列,考虑可能我会考虑使用事件来完成。不过还得看你的具体情况决定
    BigUncleLee
        7
    BigUncleLee  
    OP
       2016-07-06 22:49:35 +08:00
    @wevsty 感谢回复 ☺
    '做个队列或者链表来完成,优先处理队列中的某些任务'
    我一时没有思路 能否再解释下这句话吗 非常感谢
    wevsty
        8
    wevsty  
       2016-07-06 22:54:57 +08:00   ❤️ 1
    @BigUncleLee
    用链表举例好了
    用一个线程维护链表,设计一个类或者结构标记任务和任务优先级,如果有新任务就加入链表。工作线程遍历链表,优先处理结构中标记为最优先的任务,然后删除链表中的这个任务就好。
    如果链表数据同步很麻烦,可以考虑单独开辟链表维护线程
    SoloCompany
        9
    SoloCompany  
       2016-07-06 23:37:43 +08:00
    CountDownLatch 适用于多任务协作和线程状态无关
    如果你的自己管理的非池化线程,那么就最古老的 Thread.join 方法就可以了
    thread1.join();
    thread2.join();
    // 这个位置的代码必然会在 thread1 和 thread2 结束后才会被执行
    不仅限于 java ,应该所有支持线程的语言,都应该有 join 语句
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2904 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:01 · PVG 21:01 · LAX 05:01 · JFK 08:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.