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

Java 併發編程入門:線程創建、優先級、Executor 框架實戰

     編輯:Java 相關知識

基礎線程創建與運行

class Task implements Runnable {
    private static int idGen = 0;
    private final int id = idGen++;
    private int countDown = 5;
    private int priority;

    public void setPriority(int p) { priority = p; }
    @Override public void run() {
        Thread.currentThread().setPriority(priority);
        while (countDown-- > 0) {
            // 模擬計算負載
            double d = 1.2;
            while (d < 10000) d += (Math.E + Math.PI) / d;
            System.out.println("#" + id + "(" + countDown + ") priority=" + priority);
        }
    }
}

public class BasicThread {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            Task t = new Task();
            t.setPriority(i == 0 ? Thread.MAX_PRIORITY : Thread.MIN_PRIORITY);
            new Thread(t).start();
        }
    }
}

觀察:高優先級線程 (id=0) 可能搶佔更多 CPU 時間片,但**優先級只是提示,不保證調度順序**,受 OS、JVM 實現影響。

Executor 框架:生產級線程管理

手動管理 new Thread() 缺點:頻繁創建銷毀開銷大、無法控制併發數、異常處理困難、無返回值。ExecutorService 解決所有問題。

import java.util.concurrent.*;

public class ExecutorDemo {
    public static void main(String[] args) {
        // 1. 固定線程池 (適合長任務)
        ExecutorService fixed = Executors.newFixedThreadPool(4);
        // 2. 緩存線程池 (適合大量短任務)
        ExecutorService cached = Executors.newCachedThreadPool();
        // 3. 單線程池 (串行執行)
        ExecutorService single = Executors.newSingleThreadExecutor();
        // 4. 定時任務池
        ScheduledExecutorService scheduled = Executors.newScheduledThreadPool(2);

        // 提交任務
        for (int i = 0; i < 10; i++) {
            Task t = new Task();
            t.setPriority(i == 0 ? Thread.MAX_PRIORITY : Thread.NORM_PRIORITY);
            cached.execute(t); // 無返回值
            // Future f = cached.submit(t); // 有返回值/可取消
        }

        // 關閉流程
        cached.shutdown(); // 拒絕新任務,處理完現有任務
        try {
            if (!cached.awaitTermination(60, TimeUnit.SECONDS)) {
                cached.shutdownNow(); // 強制中斷
            }
        } catch (InterruptedException e) {
            cached.shutdownNow();
        }
    }
}

核心接口體系

接口說明
Executor最頂層,只有一個 execute(Runnable)
ExecutorService擴展生命周期管理 (shutdown, submit, invokeAll...)
ScheduledExecutorService擴展定時/周期執行
ThreadPoolExecutor核心實現,可自定義核心/最大線程、隊列、拒絕策略、線程工廠

自定義線程池最佳實踐

ThreadPoolExecutor pool = new ThreadPoolExecutor(
    4,                    // corePoolSize
    8,                    // maximumPoolSize
    60L, TimeUnit.SECONDS,// keepAliveTime
    new LinkedBlockingQueue<>(100), // workQueue 有界隊列防 OOM
    new ThreadFactoryBuilder().setNameFormat("biz-%d").build(), // 命名便於排查
    new ThreadPoolExecutor.CallerRunsPolicy() // 拒絕策略:由調用線程執行,緩衝峰值
);

關鍵建議

  1. 業務隔離:不同業務用不同線程池,避免相互影響。
  2. 有界隊列:拒絕無界 LinkedBlockingQueue,防止任務堆積 OOM。
  3. 線程命名:ThreadFactoryBuilder (Guava) 或自定義工廠,日誌排查神器。
  4. 拒絕策略:CallerRunsPolicy 適合不想丟任務且能接受延遲的場景。
  5. 監控指標:隊列積壓、活躍線程數、完成任務數、拒絕次數,接入 Prometheus/Grafana。

併發編程核心:**線程池隔離、有界資源、可觀測性**。

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