gpt4 book ai didi

java - 如何清理不断运行的线程?

转载 作者:行者123 更新时间:2023-12-03 12:59:33 25 4
gpt4 key购买 nike

我有一个包含作为字段的Thread的类,当该类被垃圾回收时,线程将继续运行,这是我不想发生的事情。

像这样:

public class A
{
Thread thread;

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

thread.start();
}
}

但是,当A消失时,线程继续存在。我已经读过有关使用 finalize方法的信息,但始终不建议这样做。解决这个问题的正确方法是什么?

最佳答案

实时线程被认为是garbage collector root,因此即使您的A消失了,线程也会停留在周围(顺便说一句,Thread持有引用的任何对象也是如此)。

同样,即使线程本身受GC约束,让GC正常终止它也是一件棘手的事情。

实际上并没有一种自动终止线程的方法,我建议您不要使用finalize for various reasons(还要注意,如果您的线程碰巧持有对A实例的引用,那么Afinalize绝对不会被调用,因为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实现 AutoCloseable并在 close()中停止线程,那么您还可以获得能够使用 try-with-resources进行清理的好处。

进一步阅读垃圾回收器的wrt线程行为:
  • Java threads and garbage collector
  • Java Thread Garbage collected or not
  • 关于java - 如何清理不断运行的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42602697/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com