Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何清理无休止运行的线程?_Java_Multithreading_Garbage Collection - Fatal编程技术网

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

Java 如何清理无休止运行的线程?,java,multithreading,garbage-collection,Java,Multithreading,Garbage Collection,我有一个类,它包含一个线程作为一个字段,当该类被垃圾收集时,该线程将继续运行,这是我不希望发生的 像这样: public class A { Thread thread; public A() { thread = new Thread() { @Override public void run() { while(!isInterrupted())

我有一个类,它包含一个
线程
作为一个字段,当该类被垃圾收集时,该线程将继续运行,这是我不希望发生的

像这样:

public class A
{
    Thread thread;

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

        thread.start();
    }
}

但是,当A消失时,线仍然存在。我读过关于使用
finalize
方法的文章,但总是不鼓励这样做。处理这个问题的正确方法是什么?

活动线程被视为一个线程,因此即使
a
不存在,线程也会粘住(顺便说一下,任何表示
thread
的对象都会保留引用)

而且,即使线程本身受到GC的约束,让GC优雅地终止它也是一件棘手的事情

实际上没有一种方法可以自动终止线程,我建议不要使用
finalize
(还要注意的是,如果您的线程碰巧包含对
a
实例的引用,那么
a
finalize
肯定永远不会被调用,因为您的
a
永远不会被垃圾收集)

相反,在处理完线程后显式终止它。这是唯一真正安全和可预测的选择

例如,您可以公开一个
stop()
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
implement
AutoCloseable
并在
close()
中停止线程,那么您还可以使用它进行清理

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


  • 是的,我希望我不必手动调用停止方法或其他任何东西,但哦,好。@ NAMEMCCY是的,这有点令人恼火,但它也像java一样的语言,所以在光明的一面,没有人会真正地盯着它。这是一个非常典型的实践,不应该给代码的读者造成混乱。