首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 線程生命週期與死亡狀態深度解析

     編輯:Java 相關知識

線程三種正常終止方式

  1. run()/call() 執行完畢 → 正常結束
  2. 拋出未捕獲的 Exception 或 Error → 異常終止
  3. 調用 stop()(已棄用,不安全) → 強制終止

主線程與子線程關係

  • 主線程結束 不影響 子線程(非守護線程)
  • JVM 進程在所有非守護線程結束後才退出
  • setDaemon(true) 必須在 start() 前調用

isAlive() 狀態判斷

實測程式碼

public class ThreadDeathDemo {
    static class Task implements Runnable {
        private final boolean throwEx;
        Task(boolean throwEx) { this.throwEx = throwEx; }
        @Override public void run() {
            for (int i = 1; i <= 10; i++) {
                System.out.println("子線程存活:" + i);
                try { Thread.sleep(500); } catch (InterruptedException ignored) {}
                if (throwEx && i == 5) throw new RuntimeException("故意拋出");
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(new Task(true));
        t.start();
        while (true) {
            Thread.sleep(300);
            System.out.println("主線程檢測 isAlive=" + t.isAlive());
            if (!t.isAlive()) break;
        }
    }
}

輸出結果分析

子線程存活:1
主線程檢測 isAlive=true
子線程存活:2
主線程檢測 isAlive=true
...
子線程存活:5
Exception in thread "Thread-0" java.lang.RuntimeException: 故意拋出
主線程檢測 isAlive=false  ← 異常終止,isAlive 變 false

最佳實踐

  • 使用 Thread.UncaughtExceptionHandler 統一處理未捕獲異常
  • 優雅關閉:interrupt() + 任務內檢查 Thread.interrupted()
  • 避免使用 stop()、suspend()、resume()(均已棄用)
  • 長時間任務定期檢查中斷標誌,釋放資源後退出
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
狀態isAlive()
NEWfalse
RUNNABLE (就緒/執行中)true
BLOCKED/WAITING/TIMED_WAITINGtrue
TERMINATEDfalse