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

Java 線程入門教程:從基礎概念到併發編程核心構件的完整學習路徑

     編輯:Java 相關知識

本教程面向具備 Java 基礎、但缺乏多線程經驗的開發者。系統講解線程本質、創建啟動、數據交換、控制協作、同步互斥等核心知識,並提供完整代碼示例,助你快速掌握編寫簡單多線程程序的能力,並能閱讀理解基於線程的現有代碼。

一、線程是什麼?為什麼需要它?

  • 定義:線程是進程內的一條執行路徑,擁有獨立的程序計數器、棧、局部變量,共享進程的堆內存、方法區、文件句柄等資源。
  • 優勢:
    1. 提高響應性(GUI/服務端主線程分派任務給後台線程)。
    2. 提升吞吐率(多核 CPU 真並行,單核 CPU 重疊 IO 與計算)。
    3. 簡化建模(異步事件、定時任務、生產消費等場景自然映射為獨立線程)。

二、創建並啟動線程的兩種標準方式

1. 實現 Runnable 接口(推薦)

public class MyTask implements Runnable {
    @Override public void run() { System.out.println("執行任務: " + Thread.currentThread().getName()); }
}
Thread t = new Thread(new MyTask());
t.start(); // 必須調用 start(),而非 run()

關鍵點:start() 啟動新線程並異步調用 run();直接調用 run() 只是主線程同步執行,無併發效果。

2. 繼承 Thread 類

public class MyThread extends Thread {
    @Override public void run() { System.out.println("執行任務: " + getName()); }
}
new MyThread().start();

對比:Runnable 解耦任務與線程控制,支持線程池、Lambda、避免單繼承限制,為首選。

三、線程生命週期與狀態轉換

NEW → RUNNABLE(就緒/運行)↔ BLOCKED/WAITING/TIMED_WAITING(阻塞/等待/超時等待)→ TERMINATED(終止)。
常見觸發:sleep()、wait()、join()、IO 等待、鎖競爭、yield() 主動讓出 CPU。

四、線程數據交換與共享

  • 共享內存:實例字段、靜態字段、堆對象——需同步保護。
  • 線程封閉:局部變量、方法參數(棧上私有)、ThreadLocal——天然線程安全。
  • 安全發布:final 域、volatile 域、鎖保護下的發布、線程安全容器(ConcurrentHashMap 等)。

五、線程控制基礎 API

方法作用注意
sleep(ms)當前線程休眠,不釋放鎖拋 InterruptedException,需處理中斷
yield()提示調度器當前線程讓出 CPU不保證調度行為,不釋放鎖
join()等待目標線程終止可帶超時,本質是 wait() 循環
interrupt()設置中斷標誌,喚醒阻塞線程需在代碼中檢查 isInterrupted() 或捕獲 InterruptedException
setPriority(int)設置線程優先級 (1-10)僅為調度提示,不保證執行順序

六、同步與互斥:保護共享數據

1. synchronized 關鍵字

  • 同步方法:synchronized void method()(鎖 this / Class)。
  • 同步塊:synchronized(lock) { ... }(顯式鎖,粒度可控)。

2. 內置鎖特性

  • 可重入:同一線程可重複獲取同一鎖。
  • 自動釋放:正常退出、異常拋出、wait() 時自動釋放。

3. volatile 關鍵字

保證可見性(寫入立即對其他線程可見)與有序性(禁止指令重排),不保證原子性。適用於狀態標誌、單次發布等場景。

七、線程協作:wait / notify / notifyAll

基於對象鎖的條件等待機制:

synchronized(lock) {
    while(!condition) lock.wait(); // 釋放鎖並等待
    // 條件滿足,執行業務
    lock.notifyAll(); // 通知其他等待線程
}

鐵律:while 循環檢查條件、持有鎖調用、優先 notifyAll()。

八、經典模式:生產者-消費者

class Buffer {
    final Object lock = new Object();
    Queue<Integer> q = new LinkedList<>();
    final int MAX = 10;
    void put(int v) throws InterruptedException {
        synchronized(lock) {
            while(q.size() == MAX) lock.wait();
            q.add(v);
            lock.notifyAll();
        }
    }
    int take() throws InterruptedException {
        synchronized(lock) {
            while(q.isEmpty()) lock.wait();
            int v = q.poll();
            lock.notifyAll();
            return v;
        }
    }
}

九、高級併發工具包:java.util.concurrent (JUC)

實際開發優先使用 JUC,而非手寫底層同步:

  • 執行器框架:ExecutorService、ThreadPoolExecutor、Executors 工廠。
  • 同步器:CountDownLatch、CyclicBarrier、Semaphore、Phaser。
  • 鎖與條件:ReentrantLock、ReadWriteLock、Condition(支持多條件隊列)。
  • 線程安全容器:ConcurrentHashMap、CopyOnWriteArrayList、BlockingQueue 實現類。
  • 原子類:AtomicInteger、LongAdder、AtomicReference 等無鎖 CAS 操作。
  • Future/CompletableFuture:異步計算結果、組合編排。

十、學習路徑建議

  1. 掌握本教程所有基礎概念與 API。
  2. 深入學習 JMM(Java Memory Model):happens-before、volatile、final 語義。
  3. 系統學習 java.util.concurrent 包核心組件源碼與應用模式。
  4. 研讀《Java Concurrency in Practice》(Java 併發編程實戰)經典著作。
  5. 實戰:構建高併發服務、異步處理管道、緩存系統等項目。

更多詳細教程請訪問 IBM developerWorks:Java 線程完整教程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved