所以在下面:public class JavaClass { public static void main(String[] args) { JavaClass clazz = new JavaClass(); clazz.startCustomThread(); clazz = new JavaClass(); clazz.startCustomThread(); } public void startCustomThread() { new MyThread().startThread(); } private static class MyThread { public void startThread() { new Thread(() -> { System.out.println("In thread " + Thread.currentThread().getName()); while (true) { try { Thread.sleep(1000 * 5); System.out.println("Woke up " + Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } }}输出是:In thread Thread-1In thread Thread-0Woke up Thread-0Woke up Thread-1.... 由于clazz应该在第二个实例之后进行 GC,并且第一个线程在第一次调用的本地范围内启动,所以startCustomThread()我的问题是为什么第一个线程没有终止?
3 回答
GCT1015
TA贡献1827条经验 获得超4个赞
如果您具体询问为什么JavaClass
对象未被 GC 处理。它可能是(取决于 VM 参数)。
如果您问为什么该对象生成的线程继续运行,那是因为它创建了一个新线程Thread
并运行它。这只会在run()
方法正常完成或被System.exit()
调用时完成。
DIEA
TA贡献1820条经验 获得超2个赞
您调用了startCustomThread
两次方法,因此启动了 2 个线程。
来自Thread
文档:
Java 虚拟机继续执行线程,直到发生以下任一情况:
已调用 Runtime 类的退出方法,安全管理器已允许执行退出操作。
所有不是守护线程的线程都已死亡,要么是从对 run 方法的调用返回,要么是抛出一个传播到 run 方法之外的异常。
这些选项均不适用于您的情况,因此该线程仍然存在。这与垃圾收集无关。
慕村225694
TA贡献1880条经验 获得超4个赞
该行clazz = new JavaClass();
只是将新对象分配给您的本地引用,并且不会破坏该引用所引用的先前创建的对象。此行不保证对象被垃圾收集。
此外,对象的垃圾回收不一定与线程的生命周期相关——您的线程可能会被中断或完成其执行,但对象仍可能存在于堆中并正在等待 GC。
添加回答
举报
0/150
提交
取消