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

Java 線程生命週期全解析:四大狀態、sleep/suspend/interrupt 三種終止方式

     編輯:Java 相關知識

線程四大狀態與控制方法

一、創建與運行

LifeCycle thread1 = new LifeCycle();
thread1.isAlive();  // false (等待態)
thread1.start();    // 啟動 → 運行態
thread1.isAlive();  // true
thread1.join();     // 等待結束
thread1.isAlive();  // false (終止態)

二、掛起與喚醒 (棄用 API 警示)

狀態描述相關方法
等待 (新建)創建後未啟動start(), run()
運行執行 run() 代碼isAlive() 判斷
掛起/阻塞暫停執行sleep(), suspend() (棄用)
停止/終止線程結束stop() (棄用), interrupt()

關鍵差異:suspend 可跨線程操作,sleep 僅影響當前線程。

棄用原因:可能導致死鎖/數據不一致等不可預期後果。

sleep() 使用細節

  • 兩個重載:sleep(long ms), sleep(long ms, int ns)
  • 納秒精度通常不可達,JVM 取最接近毫秒值
  • 必須捕獲 InterruptedException (run() 不能 throws)
  • 休眠中被 interrupt() → 拋出異常並清除中斷標誌

三、終止線程三種方式

1. 退出標誌位 (推薦,優雅)

public volatile boolean exit = false;
public void run() { while (!exit); }
main() { thread.exit = true; thread.join(); }

volatile 保證跨線程可見性。

2. stop() 強制終止 (極度不推薦)

如強制斷電,可能導致鎖未釋放、數據損壞、資源洩漏。

3. interrupt() 中斷 (標準方式)

場景 A:線程阻塞中 (sleep/wait/join)

thread.sleep(50000);
thread.interrupt();  // sleep 拋出 InterruptedException → 線程結束

場景 B:運行中輪詢標誌

while (!Thread.interrupted()) { ... }  // 或 !isInterrupted()

兩判斷方法區別:

  • Thread.interrupted():靜態,檢查當前線程並清除標誌
  • isInterrupted():實例,檢查指定線程、不清除標誌
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方法作用狀態
suspend()掛起指定線程棄用
resume()喚醒掛起線程棄用
sleep(ms)當前線程休眠推薦