我有一个包含Thread
字段的类,当类被垃圾收集时,线程继续运行,我不想发生这种情况。
像这样:
public class A
{
Thread thread;
public A()
{
thread = new Thread() {
@Override
public void run()
{
while(!isInterrupted())
{
//Do work
}
}
};
thread.start();
}
}
但是当A消失的时候,线程继续存在。我读过有关使用finalize
方法的内容,但总是不鼓励这样做。处理这个问题的正确方法是什么?
答案 0 :(得分:2)
实时线程被认为是garbage collector root,所以即使你的A
消失了,线程仍然存在(顺便说一下,Thread
持有引用的任何对象都是如此)。
即使线程本身受GC限制,让GC正常终止它也是一项棘手的工作。
没有办法自动终止线程,我建议不要finalize
for various reasons(另请注意,如果你的帖子碰巧引用了你的A
}实例然后A
的{{1}} 肯定永远不会被调用,因为你的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
并停止AutoCloseable
中的帖子,那么您还可以获得使用try-with-resources进行清理的奖励。
进一步阅读垃圾收集器的行为线程: