線程創建是併發編程的起點。本文通過 Swing 打字遊戲案例,對比三種創建模式的優劣與適用場景。

需求:定時產生隨機字母/數字顯示,點擊「Start」啟動,「Quit」退出。
public class RandomCharacterGenerator extends Thread implements CharacterSource {
private volatile boolean done = false;
private Random random = new Random();
private CharacterEventHandler handler = new CharacterEventHandler();
public void run() {
for (;;) {
nextCharacter();
try { Thread.sleep(getPauseTime()); }
catch (InterruptedException ie) { return; }
}
}
// 啟動:new RandomCharacterGenerator().start();
}
優點:可直接擴展線程行為(如實現其他介面)
缺點:單繼承限制,任務與線程耦合
Thread thread = new Thread(new Runnable() {
@Override public void run() { /* 任務邏輯 */ }
});
thread.start();
核心優勢:
關鍵認知:main() 也是線程(主線程),任何線程均可啟動新線程,調度順序由 OS 線程調度器決定,不可預測。
ExecutorService exec = Executors.newCachedThreadPool(); exec.execute(new RunnableClass);
| 類型 | 創建方式 | 特點 | 適用場景 |
|---|---|---|---|
| CachedThreadPool | Executors.newCachedThreadPool() | 按需創建,空閒 60s 回收,無上限 | 短任務、數量不定、追求響應 |
| FixedThreadPool | Executors.newFixedThreadPool(n) | 固定 n 線程,隊列無界 | 長任務、限制併發度、資源可控 |
| SingleThreadExecutor | Executors.newSingleThreadExecutor() | 單線程串行,天然線程安全 | 順序執行、無需同步、簡單後台任務 |
LinkedBlockingQueue 等)// Cached:不斷創建直到有線程空閒 ExecutorService cached = Executors.newCachedThreadPool(); for (int i=0; i<5; i++) cached.execute(new Task()); cached.shutdown(); // Fixed:3線程執行5任務 ExecutorService fixed = Executors.newFixedThreadPool(3); for (int i=0; i<5; i++) fixed.execute(new Task()); fixed.shutdown();
Runnable + ThreadExecutorServiceFixedThreadPoolSingleThreadExecutor核心洞見:併發編程最大挑戰在於「不可預測的執行順序」導致的競態條件,贯穿整個線程機制演進史。