所以在下面: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
提交
取消