当线程死时,它的对象会发生什么?

When a thread is dead what happens to its object?

提问人:mp3001 提问时间:7/25/2021 最后编辑:mp3001 更新时间:7/25/2021 访问量:485

问:

以下代码给了我 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。

java 多线程 nullpointerexception java-threads 线程组

评论

0赞 khelwood 7/25/2021
线程对象仍然存在。线程组为 null,因为线程已失效。查看 docs.oracle.com/javase/8/docs/api/java/lang/...
0赞 mp3001 7/25/2021
但是当我发表评论时,它给了我作为 ThreadGroup 名称。Thread.sleep(5000);main
1赞 khelwood 7/25/2021
因为在这种情况下,线程还没有死。
0赞 armagedescu 7/26/2021
看起来返回 null。检查一下。t.getThreadGroup()

答:

1赞 Nathan Hughes 7/25/2021 #1

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

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

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

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