如果对象不再被引用,那么扩展Thread的“对象线程”会发生什么?

时间:2014-08-30 08:47:57

标签: java multithreading thread-safety terminate

public class MyClass extends Thread{
    public void run() {

       try {
          while(!Thread.currentThread().isInterrupted()) {
             // ...
          }
       } catch (InterruptedException consumed)
          /* Allow thread to exit */
       }

    }
    public void cancel() { interrupt(); }

    //etc.
}

在出于某种原因解构对象之前,我是否应该像这样调用cancel(),还是我不应该担心它?

1 个答案:

答案 0 :(得分:3)

正在运行的线程及其对应的Thread对象是GC root.因此没有资格进行垃圾回收。

如果要GC运行正在运行的线程的Thread对象,那么该线程将需要停止。如果您已正确实施中断机制,则需要使用interrupt方法cancel()线程。一旦线程从其run()方法返回,它就完成了,不再是GC根。如果你没有对其Thread对象的实时引用,它将被垃圾收集。