我正在为这个问题寻找一个干净的设计/解决方案:我有两个线程,只要用户愿意,它们就可以运行,但最终会在用户发出停止命令时停止。但是,如果其中一个线程突然结束(例如,由于运行时异常),我想停止另一个线程。
现在两个线程都执行 Runnable
(所以当我说“停止线程”时,我的意思是我在 Runnable
实例上调用了一个 stop() 方法) ,我在想的是避免使用线程(Thread 类)并使用 CompletionService
接口(interface),然后将两个 Runnable 提交给该服务的一个实例。
有了这个,我将使用 CompletionService 的方法 take()
,当此方法返回时,我将停止两个 Runnable,因为我知道至少其中一个已经完成。现在,这可行,但如果可能的话,我想知道一个更简单/更好的解决方案来解决我的问题。
此外,当我们有 n
个线程并且其中一个完成后立即停止执行所有其他线程时,什么是好的解决方案?
提前致谢。
最佳答案
没有 Runnable.stop()
方法,因此显然无法启动。
不要使用 Thread.stop()
!在绝大多数情况下,它从根本上来说是不安全的。
如果正确实现,这里有一些应该有效的方法。
您可以让两个线程定期检查一些公共(public)标志变量(例如,将其称为
stopNow
),并安排两个线程在完成时设置它。 (标志变量需要是易变的......或适当同步。)您可以让两个线程定期调用
Thread.isInterrupted()
方法来查看它是否已被中断。然后每个线程都需要在完成时调用另一个线程的Thread.interrupt()
。
I know Runnable doesn't have that method, but my implementation of Runnable that I pass to the threads does have it, and when calling it the runner will finish the run() method (something like Corsika's code, below this answer).
据我所知,Corsika 的代码假设有一个stop()
方法在被调用时会做正确的事情。真正的问题是你是如何实现的?或者您打算如何实现?
如果您已经有了一个有效的实现,那么您就有了解决问题的方法。
否则,我的回答提供了两种可能的方法来实现“立即停止”功能。
I appreciate your suggestions, but I have a doubt, how does 'regularly check/call' translate into code ?
这完全取决于 Runnable.run()
方法执行的任务。它通常需要向某些循环添加检查/调用,以便测试经常发生……但不会太频繁。您还希望仅检查何时停止计算是安全的,这是您必须自己解决的另一件事。
关于java - 给定两个 Java 线程,当其中一个完成时停止一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13656244/