jpl*_*lot 4 java concurrency runnable
我正在为这个问题寻找一个干净的设计/解决方案:我有两个线程,可以在用户想要的时候运行,但最终在用户发出stop命令时停止.但是,如果其中一个线程突然结束(例如,由于运行时异常),我想停止另一个线程.
现在两个线程都执行一个Runnable(所以当我说'停止一个线程'我的意思是我在Runnable实例上调用了一个stop()方法),我在想的是避免使用线程(Thread类)并使用CompletionService接口然后将两个Runnables提交给此服务的实例.
有了这个,我会使用CompletionService的方法take(),当这个方法返回时,我会停止两个Runnables,因为我知道其中至少有一个已经完成.现在,这有效,但如果可能的话,我想知道一个更简单/更好的解决方案.
另外,当我们有n线程时,只要其中一个完成停止执行所有其他线程,什么是一个好的解决方案?
提前致谢.
没有Runnable.stop()方法,所以这是一个明显的非首发.
不要用Thread.stop()!在绝大多数情况下,它基本上是不安全的.
如果正确实施,以下是一些应该有效的方法.
您可以让两个线程定期检查一些常见的标志变量(例如调用它stopNow),并安排两个线程在完成时设置它.(标志变量需要是易失性的......或者是正确同步的.)
您可以让两个线程定期调用该Thread.isInterrupted()方法以查看它是否已被中断.然后每个线程Thread.interrupt()在完成时需要调用另一个线程.
我知道Runnable没有那个方法,但是我传递给线程的Runnable的实现确实有它,并且当调用它时,运行器将完成run()方法(类似于Corsika的代码,在这个答案之下).
据我所知,Corsika的代码假设有一种stop()方法可以在调用时做正确的事情.真正的问题是你是如何实现它的?或者你打算如何实现它?
如果您已经有一个可行的实现,那么您就可以找到问题的解决方案.
否则,我的回答提供了两种可能的方法来实现"立即停止"功能.
我感谢您的建议,但我有疑问,"定期检查/致电"如何转换成代码?
它完全取决于该Runnable.run()方法执行的任务.它通常需要在某些循环中添加检查/调用,以便经常合理地进行测试......但不要太频繁.您还想检查何时可以安全地停止计算,这是您必须自己解决的另一件事.