【问题标题】:What happens to the "thread of the object" extending Thread, if the object is no longer referred to?如果不再引用对象,扩展 Thread 的“对象的线程”会发生什么?
【发布时间】:2014-08-30 16:59:12
【问题描述】:
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(),还是应该不用担心?

【问题讨论】:

  • 定义解构
  • 如果一个线程正在运行,它可以被 GC 访问。我不明白你想问什么问题。
  • 解构:摆脱对象的引用...
  • 当所有引用消失时,对象不会自动销毁。 GC 最终会解决它。但是......如果线程仍在运行,那么仍然存在对您的对象的隐式引用。它不会因为您没有引用它而自动停止或收集垃圾。
  • 你不应该关心这些事情,你需要关心的只是定义你的线程应该做什么以及它应该做多长时间。因此,请考虑您的线程是否应该在外部中止并根据需要实施。其他一切都取决于 Java。

标签: java multithreading thread-safety terminate


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 2023-04-08
    • 1970-01-01
    • 2023-04-01
    • 2015-03-09
    • 1970-01-01
    • 2013-10-31
    相关资源
    最近更新 更多