我正在运行ExecutorService
执行繁重的计算,但是我不想用运行器操作污染算法类/方法代码,在这种情况下,我想定期检查它是否应该优雅地终止。
我试图寻找解决方案,但仍然没有成功,我得出的结论是这是不可能的,因为只有线程本身被允许“自动杀死自己”。
所以我的问题是,是否有任何方法可以通过调用一些强制尝试终止线程来终止线程“外部”的线程。
如果不是,最好的解决方案是使用方面并通过添加终止状态检查来拦截每次迭代?
我正在运行ExecutorService
执行繁重的计算,但是我不想用运行器操作污染算法类/方法代码,在这种情况下,我想定期检查它是否应该优雅地终止。
我试图寻找解决方案,但仍然没有成功,我得出的结论是这是不可能的,因为只有线程本身被允许“自动杀死自己”。
所以我的问题是,是否有任何方法可以通过调用一些强制尝试终止线程来终止线程“外部”的线程。
如果不是,最好的解决方案是使用方面并通过添加终止状态检查来拦截每次迭代?
你可以打电话thread.interrupt()
。如果线程“尊重”中断,这可能会导致线程退出。例如,如果线程在 IO 上被阻塞,或者 onwait()
或 onsleep()
InterruptedExcption
将被抛出。但是,如果它在不检查isInterrupted()
标志中断的繁忙循环上被“阻塞”将不起作用。
其他真正杀死线程的方法是调用 deprecated method stop()
。然而,这是最后一种可能性。此方法已被弃用,因为它确实会立即杀死线程(如kill -9
),这可能导致资源泄漏。
底线:为了能够优雅地停止线程,您必须编写为此准备好的代码,标准解决方案是尊重线程中断。
肯定有一种方法可以强制终止线程:Thread#stop
,但几乎不建议这样做。您对方面的想法似乎很有成效,但是如果您的任务中有任何类型的主循环,那么请考虑将循环替换为一系列提交的任务,其中每个任务都是一次迭代。这将允许ExecutorService#shutdown
中断处理。所有状态都可以在Runnable
提交的情况下进行。
如果您不想更改原始实现,则可以包装线程。我对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
只是一个占位符。如果满足此条件,我相信您可以将其转换为有效代码。:)
方法 thread.interrupt() 停止线程,您可以在线程本身之外调用它!
我没有太多使用 ExecutorService 。但是阅读 JavaDocs 似乎您向服务提交了一个可调用或可运行的。这些方法返回一个 Future 对象,该对象上有一个取消方法。
cancel(boolean mayInterruptIfRunning)
你试过用那个吗?