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
implementAutoCloseable
并在close()
中停止线程,那么您还可以使用它进行清理
进一步阅读垃圾收集器的行为wrt线程:
是的,我希望我不必手动调用停止方法或其他任何东西,但哦,好。@ NAMEMCCY是的,这有点令人恼火,但它也像java一样的语言,所以在光明的一面,没有人会真正地盯着它。这是一个非常典型的实践,不应该给代码的读者造成混乱。