Java線程池的核心參數
Java線程池通過ThreadPoolExecutor
類進行配置,其核心參數如下:
-
corePoolSize(核心線程數)
-
作用:線程池中保持活動的最小線程數,即使這些線程處于空閑狀態。
-
行為:默認情況下,核心線程不會因空閑超時被回收(除非設置
allowCoreThreadTimeOut(true)
)。
-
-
maximumPoolSize(最大線程數)
-
作用:線程池允許創建的最大線程數(包括核心線程和非核心線程)。
-
觸發條件:當核心線程全忙且阻塞隊列已滿時,會創建臨時線程,直到達到此值。
-
-
keepAliveTime(空閑線程存活時間)
-
作用:非核心線程(臨時線程)在空閑狀態下的存活時間,超時后會被終止。
-
單位:通過
TimeUnit
指定(如秒、毫秒)。
-
-
workQueue(阻塞隊列)
-
作用:存儲等待執行的任務。
-
常用類型:
-
LinkedBlockingQueue
:無界隊列(默認容量極大,需警惕內存溢出)。 -
ArrayBlockingQueue
:有界隊列(需指定容量)。 -
SynchronousQueue
:不存儲任務,直接提交給線程處理。
-
-
-
threadFactory(線程工廠)
-
作用:自定義線程的創建方式(如設置線程名稱、優先級)。
-
示例:
java
復制
下載
ThreadFactory factory = r -> {Thread t = new Thread(r);t.setName("custom-thread-" + t.getId());return t; };
-
-
handler(拒絕策略)
-
作用:當線程池和隊列均滿時,處理新提交的任務。
-
內置策略:
-
AbortPolicy
(默認):拋出RejectedExecutionException
。 -
CallerRunsPolicy
:由提交任務的線程直接執行。 -
DiscardPolicy
:靜默丟棄任務。 -
DiscardOldestPolicy
:丟棄隊列中最舊的任務,重新提交當前任務。
-
-
Java中線程的創建方式
-
繼承Thread類
java
復制
下載
class MyThread extends Thread {@Overridepublic void run() {System.out.println("Thread running");} } MyThread t = new MyThread(); t.start();
-
實現Runnable接口
java
復制
下載
Runnable task = () -> System.out.println("Runnable running"); Thread t = new Thread(task); t.start();
-
實現Callable接口(支持返回值)
java
復制
下載
Callable<String> task = () -> "Result"; ExecutorService executor = Executors.newSingleThreadExecutor(); Future<String> future = executor.submit(task); String result = future.get(); // 阻塞獲取結果 executor.shutdown();
-
使用線程池(推薦)
java
復制
下載
ExecutorService executor = Executors.newFixedThreadPool(4); executor.submit(() -> System.out.println("Task executed by thread pool")); executor.shutdown();
線程(Thread)與進程(Process)的區別
特性 | 進程 | 線程 |
---|---|---|
資源分配 | 獨立內存空間(堆、棧、系統資源) | 共享進程的內存空間(堆),獨立棧 |
創建開銷 | 大(需分配獨立資源) | 小(共享進程資源) |
通信方式 | 復雜(如管道、Socket、共享內存) | 簡單(直接共享內存,但需同步控制) |
切換成本 | 高(涉及上下文切換和資源切換) | 低(僅切換線程上下文) |
獨立性 | 一個進程崩潰不影響其他進程 | 一個線程崩潰可能導致整個進程終止 |
應用場景 | 需要隔離的任務(如瀏覽器多標簽頁) | 高并發任務(如Web服務器處理請求) |
線程池的工作流程
-
任務提交
-
若核心線程未滿,立即創建新線程執行。
-
若核心線程全忙,任務進入阻塞隊列。
-
-
隊列處理
-
隊列未滿時,任務排隊等待核心線程處理。
-
隊列已滿時,創建臨時線程(直到達到
maximumPoolSize
)。
-
-
拒絕策略觸發
-
當線程池和隊列均滿時,執行拒絕策略。
-
示例:自定義線程池
java
復制
下載
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, // corePoolSize4, // maximumPoolSize60, TimeUnit.SECONDS, // keepAliveTimenew ArrayBlockingQueue<>(10), // workQueuenew CustomThreadFactory(), // threadFactorynew ThreadPoolExecutor.CallerRunsPolicy() // handler );// 提交任務 for (int i = 0; i < 15; i++) {executor.submit(() -> {try {Thread.sleep(1000);System.out.println(Thread.currentThread().getName() + " 執行任務");} catch (InterruptedException e) {e.printStackTrace();}}); }executor.shutdown();
總結
-
線程池核心參數:需根據任務類型(CPU/IO密集型)合理配置。
-
線程創建方式:推薦使用線程池管理線程,避免頻繁創建銷毀開銷。
-
線程與進程:線程輕量且共享資源,適合高并發;進程隔離性強,適合需要獨立環境的任務。