杀死线程而不定期检查活动状态

时间:2013-05-23 12:33:20

标签: java multithreading

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

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

所以我的问题是,如果有任何方法通过调用一些强制尝试来终止该线程的“外部”线程。

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

5 个答案:

答案 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只是一个占位符。如果满足此条件,我相信您可以将其转换为有效代码。 :)