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

Java 線程基礎核心知識詳解:從創建到協作的完整指南

     編輯:Java 綜合教學

前言:理解進程與線程的本質區別

在 Java 並發編程的世界裡,進程是執行中程序的實例,也是作業系統進行資源分配和調度的獨立單元;而線程則是進程內部的一條執行路徑,是 CPU 調度和分派的基本單元。進程擁有獨立的記憶體空間,同一進程下的多線程共享該進程的記憶體資源。Java 原生支援多線程,使得並發任務的實現變得直觀高效。

線程的三種創建與啟動方式

1. 實現 Runnable 接口(推薦)

定義任務邏輯,實現 java.lang.Runnable 接口並重寫 run() 方法。此方式將任務與執行機制解耦,靈活性最高。

public class LiftOff implements Runnable {
    private int countDown;
    public LiftOff(int countDown) { this.countDown = countDown; }
    private String status() { return countDown > 0 ? String.valueOf(countDown) : "LiftOff!"; }
    @Override public void run() {
        while (countDown-- > 0) { System.out.println(status()); }
    }
}

2. 實現 Callable 接口(支援返回值與異常)

java.util.concurrent.Callable<V> 的 call() 方法可返回結果或拋出異常。配合 ExecutorService.submit() 可獲取 Future<V> 物件,透過 get() 阻塞等待結果。

class TaskWithResult implements Callable<String> {
    private int id;
    public TaskWithResult(int id) { this.id = id; }
    @Override public String call() throws Exception { return "Result of TaskWithResult " + id; }
}

3. 繼承 Thread 類

Thread 類構造方法接受 Runnable 任務。調用 start() 啟動新線程並執行 run()。注意:直接調用 run() 不會開啟新線程。

> **最佳實踐**:優先使用 Runnable 或 Callable,它們僅定義任務,執行機制交由執行器(如線程池)管理,解耦更徹底。

線程的六大生命週期狀態

Java 定義於 Thread.State 枚舉中:

  • NEW:線程已創建,未啟動。
  • RUNNABLE:正在執行或等待 CPU 時間片。
  • BLOCKED:等待獲取排他鎖(synchronized)。
  • WAITING:無限期等待,需其他線程顯式喚醒(wait()、join() 無超時)。
  • TIMED_WAITING:限時等待,超時自動喚醒(sleep()、wait(timeout)、join(timeout))。
  • TERMINATED:run() 結束或異常終止。

狀態轉換關係可透過 thread.getState() 監控。Java 採用搶占式調度,系統分配 CPU 時間片,避免單一線程佔用導致進程阻塞。

核心線程操作方法詳解

方法作用關鍵特性
sleep(ms)讓當前線程暫停指定毫秒不釋放鎖,回到 RUNNABLE
join()當前線程等待目標線程結束可設超時,不釋放鎖
yield()提示調度器當前線程願意讓出 CPU不保證切換,不釋放鎖
interrupt()發送中斷請求,設置中斷標誌僅影響阻塞操作(sleep/wait/join/NIO),I/O 與 synchronized 阻塞不可中斷

守護線程:JVM 的隱形助手

守護線程(Daemon)為後台服務線程(如 GC、Finalizer)。當所有非守護線程結束,JVM 退出,守護線程隨之終止。 必須在 start() 前調用 setDaemon(true)。守護線程創建的子線程默認也是守護線程。

線程協作:從 wait/notify 到 Lock/Condition

Object 監視器模式

  • wait():釋放鎖,進入 WAITING。
  • notify()/notifyAll():喚醒一個/所有等待線程,重新競爭鎖。
  • 必須在 synchronized 區塊中調用,否則拋 IllegalMonitorStateException。

經典「打蠟/拋光」協作範例展示了雙線程交替執行的協調邏輯。

Lock & Condition(JUC 升級版)

ReentrantLock 配合 Condition 提供更精細的控制:

  • await() 等同 wait(),signal()/signalAll() 等同 notify()/notifyAll()。
  • 支援多條件變量,實現更精準的喚醒策略。
  • 鎖的獲取/釋放需放在 try-finally 確保釋放。
> **實戰建議**:手動協作易出錯,生產環境優先使用高層同步工具:CountDownLatch、Semaphore、CyclicBarrier、Phaser 等。

參考經典

  1. 《Java 編程思想》第 4 版
  2. 《深入理解 Java 虛擬機》第 2 版
  3. 《Effective Java》第 2 版
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved