首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 執行緒基礎:main 執行緒 + new Thread 啟動 = 2 條執行緒,死循環導致主程式不結束

     編輯:程式設計綜合問答

程式碼中 main 啟動一個新執行緒跑無限迴圈,問題:「執行會產生幾條執行緒?」

答案:2 條執行緒

  1. Main 執行緒:JVM 啟動時自動建立,執行 main 方法。
  2. 子執行緒:new Thread(...).start() 顯式建立並啟動。

程式碼分析

public static void main(String[] args) {
    // 主執行緒從這裡開始
    new Thread(new Runnable() {
        public void run() {
            while (true) {  // 死循環
                int i = 0;
                System.out.println(Math.random());
                System.out.println(++i);  // 每次重置為 1
                System.out.println(Thread.currentThread().getName());
            }
        }
    }).start();  // 啟動子執行緒
    // 主執行緒執行完 main 方法後結束
    // 但 JVM 不會退出,因為仍有非守護執行緒 (子執行緒) 存活
}

關鍵問題點

問題影響修正建議
while(true) 無退出條件子執行緒永不結束,JVM 永不退出加入 volatile boolean running 控制迴圈,或設為守護執行緒 setDaemon(true)
int i = 0 在迴圈內每次迴圈重置,++i 永遠輸出 1移至迴圈外 int i = 0; while(...) { System.out.println(++i); }
無 Thread.sleep佔滿 CPU 核心,導致系統卡頓迴圈內加 Thread.sleep(1000) 降低頻率

正確啟動執行緒範本

public class Worker implements Runnable {
    private volatile boolean running = true;
    private int counter = 0;

    public void stop() { running = false; }

    @Override
    public void run() {
        while (running) {
            System.out.println(Thread.currentThread().getName() + ": " + ++counter);
            try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); break; }
        }
    }
}

public static void main(String[] args) throws InterruptedException {
    Worker worker = new Worker();
    Thread t = new Thread(worker, "MyWorker");
    t.start();
    
    Thread.sleep(5000);  // 主執行緒做其他事 5 秒
    worker.stop();       // 通知子執行緒優雅退出
    t.join();            // 等待子執行緒結束
    System.out.println("程式正常結束");
}

守護執行緒說明

  • t.setDaemon(true):主執行緒結束時 JVM 強制終止守護執行緒,**不執行 finally/finalize**,資料可能遺失。
  • 僅適用於**輔助性任務** (如記憶體監控、定時清理),不可用於業務關鍵邏輯。

理解「main 執行緒 + 顯式 new Thread = 2 條執行緒」,並掌握優雅啟動/停止模式,是 Java 多執行緒編程的入門必修課。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved