该问题已发布在某个网站上。我在这里找不到正确的答案,因此我将其再次发布在这里。
public class TestThread { public static void main(String[] s) { // anonymous class extends Thread Thread t = new Thread() { public void run() { // infinite loop while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { } // as long as this line printed out, you know it is alive. System.out.println("thread is running..."); } } }; t.start(); // Line A t = null; // Line B // no more references for Thread t // another infinite loop while (true) { try { Thread.sleep(3000); } catch (InterruptedException e) { } System.gc(); System.out.println("Executed System.gc()"); } // The program will run forever until you use ^C to stop it } }
我的查询与停止线程无关。让我改一下我的问题。A行(请参见上面的代码)启动一个新线程;和B行使线程引用为空。因此,JVM现在具有一个线程对象(处于运行状态),该对象不存在引用(如B行中的t = null)。所以我的问题是,为什么这个线程(在主线程中不再有引用)一直保持运行状态,直到主线程运行。根据我的理解,线程对象应该已经在B行之后被垃圾回收了。我尝试将这段代码运行5分钟或更长时间,请求Java Runtime运行GC,但是线程不会停止。
希望这次代码和问题都清楚。
正在运行的线程被认为是所谓的垃圾回收根,并且是防止东西被垃圾回收的其中一种。当垃圾收集器确定您的对象是否“ 可达 ”时,它总是使用垃圾收集器根集合作为参考点来这样做。
考虑这一点,为什么您的主线程没有被垃圾回收,也没有人引用那个线程。