Java 在不定期检查活动状态的情况下终止线程

Java 在不定期检查活动状态的情况下终止线程,java,multithreading,Java,Multithreading,我正在运行ExecutorService来执行一个繁重的计算,但是我不想用运行程序操作污染算法类/方法代码,在这种情况下,我想定期检查是否应该优雅地终止它 我试图寻找解决方案,但仍然没有成功,我的结论是,这是不可能的,因为只有线程本身被允许“自动杀死自己” 因此,我的问题是,是否有任何方法可以通过调用一些强制的atempt来终止线程,从而在线程的“外部”终止线程 如果不是,最好的解决方案可能是使用方面并通过添加终止状态检查来拦截每次迭代?当然有一种方法可以强制终止线程:thread#stop,但

我正在运行
ExecutorService
来执行一个繁重的计算,但是我不想用运行程序操作污染算法类/方法代码,在这种情况下,我想定期检查是否应该优雅地终止它

我试图寻找解决方案,但仍然没有成功,我的结论是,这是不可能的,因为只有线程本身被允许“自动杀死自己”

因此,我的问题是,是否有任何方法可以通过调用一些强制的atempt来终止线程,从而在线程的“外部”终止线程


如果不是,最好的解决方案可能是使用方面并通过添加终止状态检查来拦截每次迭代?

当然有一种方法可以强制终止线程:
thread#stop
,但这几乎是不可取的。你的观点看起来很有成效,但是如果你的任务中有任何一个主循环,那么考虑用一系列提交的任务替换循环,每个任务都是一次迭代。这将允许
ExecutorService#shutdown
中断处理。所有状态都可以在提交的
Runnable
实例中携带。

您可以调用
thread.interrupt()
。如果线程“尊重”中断,这可能会导致线程退出。例如,如果线程在IO或
wait()
sleep()
中断时被阻塞,则会抛出Exception
。但是,如果在未检查
isInterrupted()
标志中断的忙循环上被“阻止”,则中断将不起作用

另一种杀死线程的方法是调用不推荐使用的方法
stop()
。然而,这是最后一种可能性。此方法已被弃用,因为它确实会立即终止线程(如
kill-9
),从而导致资源泄漏


一句话:为了能够很好地停止线程,您必须编写相应的代码,标准的解决方案是尊重线程中断。

我很少使用Executor服务。但是在阅读JavaDocs时,您似乎向服务提交了一个可调用或可运行的。这些方法返回一个未来对象,该对象上有一个cancel方法

cancel(boolean mayInterruptIfRunning)

你试过使用它吗?

方法thread.interrupt()停止线程,你可以在线程之外调用它

如果不想更改原始实现,可以包装线程。我对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
只是一个占位符。如果满足此条件,我相信您可以将其转换为有效代码。:)

你不能中断线程吗?是的,检查一个标志。也许您可以将计算代码封装在另一个与调度逻辑接口的类中?可能的重复会让人觉得我理解错了问题。:)