本教程面向具備 Java 基礎、但缺乏多線程經驗的開發者。系統講解線程本質、創建啟動、數據交換、控制協作、同步互斥等核心知識,並提供完整代碼示例,助你快速掌握編寫簡單多線程程序的能力,並能閱讀理解基於線程的現有代碼。
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() 只是主線程同步執行,無併發效果。
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。
| 方法 | 作用 | 注意 |
|---|---|---|
sleep(ms) | 當前線程休眠,不釋放鎖 | 拋 InterruptedException,需處理中斷 |
yield() | 提示調度器當前線程讓出 CPU | 不保證調度行為,不釋放鎖 |
join() | 等待目標線程終止 | 可帶超時,本質是 wait() 循環 |
interrupt() | 設置中斷標誌,喚醒阻塞線程 | 需在代碼中檢查 isInterrupted() 或捕獲 InterruptedException |
setPriority(int) | 設置線程優先級 (1-10) | 僅為調度提示,不保證執行順序 |
synchronized void method()(鎖 this / Class)。synchronized(lock) { ... }(顯式鎖,粒度可控)。保證可見性(寫入立即對其他線程可見)與有序性(禁止指令重排),不保證原子性。適用於狀態標誌、單次發布等場景。
基於對象鎖的條件等待機制:
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;
}
}
}
實際開發優先使用 JUC,而非手寫底層同步:
ExecutorService、ThreadPoolExecutor、Executors 工廠。CountDownLatch、CyclicBarrier、Semaphore、Phaser。ReentrantLock、ReadWriteLock、Condition(支持多條件隊列)。ConcurrentHashMap、CopyOnWriteArrayList、BlockingQueue 實現類。AtomicInteger、LongAdder、AtomicReference 等無鎖 CAS 操作。java.util.concurrent 包核心組件源碼與應用模式。更多詳細教程請訪問 IBM developerWorks:Java 線程完整教程。