【问题标题】:One thread dependent on the other一个线程依赖于另一个线程
【发布时间】:2014-02-17 10:22:47
【问题描述】:

如果有 4 个线程在运行,并且希望 t1 线程完成它的指令并终止,并且希望 t2 在 t1 终止后也应该终止,即使它的指令没有完全完成,而 t3 和 t4 仍在运行,那它应该只依赖于 t2,既不依赖于 t3,也不依赖于 t4。

有人建议我制作 t2 守护进程,但这会使 t2 依赖于 t3 以及 t4。任何人都可以通过示例帮助我如何做到这一点?

【问题讨论】:

  • 当然可以。阅读“Lesson: Concurrency”。
  • 那么t1 还能做什么?有什么事吗?
  • 模糊的问题,以及许多可能的解决方案;例如,while 循环中的共享 AtomicBoolean
  • 你想用 4 个线程解决哪个问题?可能有更简单的方法。
  • 面试时问的。

标签: java multithreading daemon


【解决方案1】:

你可以使用CountDownLatch来实现。

它是一种同步辅助,允许一个或多个线程等待 直到在其他线程中执行的一组操作完成。CountDownLatch 是一种通用的同步工具,可用于多种目的。倒计时锁 初始化为 1 用作简单的开/关锁存器,或 gate:所有调用 await 的线程都在 gate 处等待,直到它被打开 通过调用 countDown() 的线程。一个 CountDownLatch 初始化为 N 可用于使一个线程等待直到 N 个线程完成 某个动作,或者某个动作已完成 N 次。

代码 sn-p -

CountDownLatch doneSignal = new CountDownLatch(1);
// Share the same object between two thread
Thread T1{
 public void run(){ 
  doneSignal.await(); //T1 will wait untill T2 finshed
  ...
 }
}
...
Thread T2{
 public void run(){ 
  ...
  doneSignal.countDown(); // sending signal that T2 is over
 }
}

【讨论】:

    【解决方案2】:

    使用Future 并在必要时取消它。

    【讨论】:

      【解决方案3】:

      盲目破坏线程是一件危险的事情

      在 java 中,您可以做的最好的事情是 interrupt() t2 并让它冒泡(根据需要进行手动检查),以便 t2 可以自行清理

      例如在循环中你可以这样做:

      if(Thread.interrupted())throw new InterruptedException();
      

      定期在 t2 中(或自定义 TimeoutException,如果这是您的风格以避免选中 InterruptedException

      【讨论】:

        猜你喜欢
        • 2022-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多