如何清理无休止的运行线程?

时间:2017-03-04 23:44:18

标签: java multithreading garbage-collection

我有一个包含Thread字段的类,当类被垃圾收集时,线程继续运行,我不想发生这种情况。

像这样:

public class A
{
    Thread thread;

    public A()
    {
        thread = new Thread() {
            @Override
            public void run()
            {
                while(!isInterrupted())
                {
                    //Do work
                }
            }
        };

        thread.start();
    }
}

但是当A消失的时候,线程继续存在。我读过有关使用finalize方法的内容,但总是不鼓励这样做。处理这个问题的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

实时线程被认为是garbage collector root,所以即使你的A消失了,线程仍然存在(顺便说一下,Thread持有引用的任何对象都是如此)。

即使线程本身受GC限制,让GC正常终止它也是一项棘手的工作。

没有办法自动终止线程,我建议不要finalize for various reasons(另请注意,如果你的帖子碰巧引用了你的A }实例然后A的{​​{1}} 肯定永远不会被调用,因为你的finalize永远不会被垃圾收集。

相反,完成后明确终止线程。它是唯一真正安全且可预测的选择。

例如,您可以公开Astop()或来自finish()的任何停止线程的方法,并记录完成后调用它的要求,比如说,当你完成它们时,你必须关闭文件和流,例如建立在您的代码段上:

A

如果您public class A { Thread thread; public A () { thread = new Thread() { @Override public void run() { while(!isInterrupted()) { //Do work } } }; thread.start(); } void stop () { thread.interrupt(); thread.join(); // if you want } } 实施A并停止AutoCloseable中的帖子,那么您还可以获得使用try-with-resources进行清理的奖励。

进一步阅读垃圾收集器的行为线程: