一个线程依赖于另一个

时间:2014-02-17 10:22:47

标签: java multithreading daemon

如果4个线程正在运行,并希望如果t1线程完成其指令并终止,并且希望t2也应该在t1终止后终止,即使其指令未完全完成,而t3和t4仍在运行,它应该只取决于t2,既不取决于t3也不取决于t4。

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

3 个答案:

答案 0 :(得分:2)

您可以使用CountDownLatch实施。

  

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

代码段 -

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
 }
}

答案 1 :(得分:1)

使用Future并在必要时取消。

答案 2 :(得分:1)

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

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

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

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

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