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

Java 線程創建三大模式(一):Thread 繼承、Runnable 實現與 Executor 框架

     編輯:Java 相關知識

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

案例背景:隨機字符產生器

Swing 打字遊戲界面

需求:定時產生隨機字母/數字顯示,點擊「Start」啟動,「Quit」退出。

模式一:繼承 Thread 類

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();
}

優點:可直接擴展線程行為(如實現其他介面)
缺點:單繼承限制,任務與線程耦合

模式二:實現 Runnable 介面(推薦)

Thread thread = new Thread(new Runnable() {
    @Override public void run() { /* 任務邏輯 */ }
});
thread.start();

核心優勢:

  • 任務與線程解耦,單任務可提交多線程
  • 支援匿名內部類 / Lambda 表達式
  • 可結合線程池復用線程

關鍵認知:main() 也是線程(主線程),任何線程均可啟動新線程,調度順序由 OS 線程調度器決定,不可預測。

模式三:Executor 框架(生產首選)

ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(new RunnableClass);

三大線程池對比

類型創建方式特點適用場景
CachedThreadPoolExecutors.newCachedThreadPool()按需創建,空閒 60s 回收,無上限短任務、數量不定、追求響應
FixedThreadPoolExecutors.newFixedThreadPool(n)固定 n 線程,隊列無界長任務、限制併發度、資源可控
SingleThreadExecutorExecutors.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();

選型建議

  1. 簡單獨立任務 → Runnable + Thread
  2. 大量短任務、需管理生命周期 → ExecutorService
  3. 需限制併發、長生命周期任務 → FixedThreadPool
  4. 串行化處理、避免同步 → SingleThreadExecutor

核心洞見:併發編程最大挑戰在於「不可預測的執行順序」導致的競態條件,贯穿整個線程機制演進史。

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