線程三種正常終止方式
run()/call() 執行完畢 → 正常結束
- 拋出未捕獲的
Exception 或 Error → 異常終止
- 調用
stop()(已棄用,不安全) → 強制終止
主線程與子線程關係
- 主線程結束 不影響 子線程(非守護線程)
- JVM 進程在所有非守護線程結束後才退出
setDaemon(true) 必須在 start() 前調用
isAlive() 狀態判斷
| 狀態 | isAlive() |
| NEW | false |
| RUNNABLE (就緒/執行中) | true |
| BLOCKED/WAITING/TIMED_WAITING | true |
| TERMINATED | false |
實測程式碼
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()(均已棄用)
- 長時間任務定期檢查中斷標誌,釋放資源後退出
- 上一篇文章: Java 冒泡排序演算法完整實作與優化版本
- 下一篇文章: Java 線程終止的三種情形與 isAlive() 狀態驗證實測
Copyright ©
程式碼之家 All Rights Reserved