gpt4 book ai didi

Java 线程垃圾是否收集

转载 作者:IT老高 更新时间:2023-10-28 11:42:28 24 4
gpt4 key购买 nike

这个问题发布在某个网站上。我没有在那里找到正确的答案,所以我再次在这里发布。

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,但线程并没有停止。

希望这次代码和问题都清楚。

最佳答案

正在运行的线程被认为是所谓的垃圾收集根,是防止垃圾收集的东西之一。当垃圾收集器确定你的对象是否是' reachable ' 与否,它总是使用垃圾收集器根集作为引用点。

考虑一下,为什么你的主线程没有被垃圾收集,也没有人引用那个。

关于Java 线程垃圾是否收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2423284/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com