【问题标题】:When a thread is dead what happens to its object?当一个线程死了,它的对象会发生什么?
【发布时间】:2021-10-01 17:06:02
【问题描述】:

以下代码给了我 NullPointerException。

class MT extends Thread{
    public void run(){
    }
}

public class ThreadGroupDemo{
    public static void main(String[] args) throws InterruptedException{
        MT t = new MT();
        t.start();
        Thread.sleep(5000);
        System.out.println(t.getName());
       //^^^^This line gives the thread name
        System.out.println(t.getThreadGroup().getName()); 
        //^^^^This line is giving me NullPointerException
    }
}

这段代码的最后一行给出了 NullPointerException。

【问题讨论】:

  • 线程对象仍然存在。线程组为空,因为线程已死。见docs.oracle.com/javase/8/docs/api/java/lang/…
  • 但是当我评论Thread.sleep(5000);时,它给了我main作为线程组名称。
  • 因为在这种情况下线程还没有死。
  • 看起来 t.getThreadGroup() 返回 null。检查一下。

标签: java multithreading nullpointerexception java-threads threadgroup


【解决方案1】:

你调用了 getThreadGroup。此方法的 api 文档说

返回该线程所属的线程组。如果此线程已终止(已停止),则此方法返回 null。

线程对象本身仍然存在,它不会以某种方式被破坏。一旦它完成了 run 方法的执行并且不再是 GC 根,那么就像任何其他对象一样,它没有资格进行垃圾回收,直到没有任何引用它。您可以通过调用 isAlive 来检查线程是否已死。

启动线程可能需要一点时间。从主线程中删除睡眠会在主线程打印和新线程启动之间产生竞争。似乎主线程可能会在新线程启动之前打印信息。

【讨论】:

    猜你喜欢
    • 2019-07-16
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多