線程是進程內部獨立的指令流,多線程讓程序能在等待事件(I/O、鎖、用戶輸入)時不阻塞主流程,實現響應式 UI、提升吞吐率、利用多核 CPU。Java 的線程模型屏蔽了底層調度細節,但要求開發者改變單線程思維,理解「同時運行」的非確定性。
Thread 覆寫 run(),調用 start() 啟動。Runnable 接口,配合 new Thread(runnable).start(),避免單繼承限制,利於邏輯與線程控制分離。yield():提示調度器當前線程可讓出 CPU,非強制。sleep(ms):強制休眠指定毫秒,需捕獲 InterruptedException,不釋放鎖。join():等待目標線程終止,可設超時,可被中斷。setPriority():設置優先級(1-10),僅為調度建議,不可依賴實現業務邏輯。多線程並發讀寫共享變量會導致數據不一致(如 EvenGenerator 示例)。解決核心是「串行化訪問」:同一時刻僅允許一個線程進入臨界區。
this(實例方法)或 Class 對象(靜態方法)作為鎖。synchronized(lockObj) { ... },可精細控制鎖粒度,提高並發度。volatile 保證讀寫可見性與有序性,長整型/雙精度型需加 volatile 才屬原子操作。i++)非原子,需同步或使用 AtomicInteger。| 狀態 | 說明 |
|---|---|
| NEW | 對象創建未啟動 |
| RUNNABLE | 就緒/運行中 |
| BLOCKED | 等待鎖、I/O、sleep、wait、join |
| TERMINATED | run() 結束或異常退出 |
wait() 釋放鎖並進入等待集,notify()/notifyAll() 喚醒,必須在同步塊中調用。PipedWriter/Reader 實現線程間字節/字符流傳輸,適合生產者-消費者場景。四必要條件:互斥、佔有並等待、非搶佔、循環等待。破壞任一條件即可預防。Java 無內置死鎖檢測,需設計時避免(如固定鎖獲取順序、使用 tryLock 超時機制)。
stop()、suspend()、resume()(不釋放鎖、易損壞對象狀態)。volatile boolean running)輪詢或 interrupt() 中斷阻塞操作(sleep/wait/join/I/O)。ThreadGroup 設計失敗,僅剩未捕獲異常處理用途。多線程優勢在於輕量級上下文切換、資源共享,但引入同步開銷、活鎖/死鎖風險、跨平台行為差異。核心原則:絕不想當然,所有共享訪問必須同步。