我正在运行ExecutorService
来执行繁重的计算,但是我不想使用运行程序操作污染算法类/方法代码,在这种情况下我想定期检查它是否应该是优雅地终止了。
我试图寻找解决方案,仍然没有成功,我得出的结论是,这是不可能的,因为只有线程本身才允许“自动”。
所以我的问题是,如果有任何方法通过调用一些强制尝试来终止该线程的“外部”线程。
如果不是,最好的解决方案是使用方面并通过添加kill状态检查来拦截每次迭代?
答案 0 :(得分:2)
您可以致电thread.interrupt()
。如果线程“尊重”中断,这可能导致线程退出。例如,如果线程在IO上被阻止,或者在wait()
或sleep()
InterruptedExcption
上被阻止。但是,如果在忙碌循环中“阻塞”,则不会检查isInterrupted()
标志中断将无效。
确实杀死该线程的其他方法是调用已弃用的方法stop()
。然而,这是最后一种可能性。不推荐使用此方法,因为它确实会立即杀死线程(如kill -9
),这会导致资源泄漏。
底线:为了能够巧妙地停止线程,你必须编写为此做好准备的代码,标准解决方案是尊重线程中断。
答案 1 :(得分:1)
确实有一种强制终止线程的方法:Thread#stop
,但这几乎是不可取的。你对方面的想法似乎很有成效,但如果你的任务中有任何主循环,那么考虑用一系列提交的任务替换循环,其中每个任务都是一次迭代。这将允许ExecutorService#shutdown
中断处理。所有州都可以在正在提交的Runnable
的情况下进行。
答案 2 :(得分:0)
我没有使用过很多ExecutorService。但是阅读JavaDocs似乎可以向服务提交可调用或可运行的内容。这些方法返回一个Future对象,它有一个取消方法。
cancel(boolean mayInterruptIfRunning)
您是否尝试过使用它?
答案 3 :(得分:0)
方法thread.interrupt()停止线程,你可以在线程本身之外调用它!
答案 4 :(得分:0)
如果您不想更改原始实现,可以包装该线程。我对Java并不熟悉,所以对于明显没有编译的例子我很抱歉:
class ThreadWrapper extends Thread {
public ThreadWrapper(Thread t, TerminateCallback c) {
// ...
}
@Override
public void run() {
t.start(Thread.SYNCHRONOUS);
c.done(this);
}
}
您需要自己实施TerminateCallback
。我还假设有一种同步启动线程的方法,Thread.SYNCHRONOUS
只是一个占位符。如果满足此条件,我相信您可以将其转换为有效代码。 :)