亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么有兩個運行線程而不是一個?

為什么有兩個運行線程而不是一個?

米琪卡哇伊 2023-06-08 19:42:05
所以在下面: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()調用時完成。


查看完整回答
反對 回復 2023-06-08
?
DIEA

TA貢獻1820條經驗 獲得超2個贊

您調用了startCustomThread兩次方法,因此啟動了 2 個線程。

來自Thread文檔:

Java 虛擬機繼續執行線程,直到發生以下任一情況:

  1. 已調用 Runtime 類的退出方法,安全管理器已允許執行退出操作。

  2. 所有不是守護線程的線程都已死亡,要么是從對 run 方法的調用返回,要么是拋出一個傳播到 run 方法之外的異常。

這些選項均不適用于您的情況,因此該線程仍然存在。這與垃圾收集無關。


查看完整回答
反對 回復 2023-06-08
?
慕村225694

TA貢獻1880條經驗 獲得超4個贊

該行clazz = new JavaClass();只是將新對象分配給您的本地引用,并且不會破壞該引用所引用的先前創建的對象。此行不保證對象被垃圾收集。

此外,對象的垃圾回收不一定與線程的生命周期相關——您的線程可能會被中斷或完成其執行,但對象仍可能存在于堆中并正在等待 GC。


查看完整回答
反對 回復 2023-06-08
  • 3 回答
  • 0 關注
  • 180 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號