如果4个线程正在运行,并希望如果t1线程完成其指令并终止,并且希望t2也应该在t1终止后终止,即使其指令未完全完成,而t3和t4仍在运行,它应该只取决于t2,既不取决于t3也不取决于t4。
有人建议我制作t2守护进程,但这会使t2依赖于t3以及t4。任何人都可以帮我解决一个例子如何做到这一点?
答案 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
)