问题描述
以下代码给了我 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。
解决方法
您调用了 getThreadGroup。此方法的 api 文档说
返回该线程所属的线程组。如果此线程已死亡(已停止),则此方法返回 null。
线程对象本身仍然存在,它不会以某种方式被销毁。一旦它完成了它的 run 方法并且不再是一个 GC 根,那么它就不会像任何其他对象一样被垃圾回收,直到没有任何引用它为止。您可以通过调用 isAlive 来检查线程是否已死。
启动一个线程可能需要一点时间。从主线程中删除睡眠会在主线程打印和新线程启动之间产生竞争。似乎主线程可能会在新线程启动之前打印信息。