在Java中,ExecutorService
是一個接口,它提供了一種將任務提交給執行的機制。通常,我們會使用Executors
工廠類來創建一個ExecutorService
實例。線程池的配置主要涉及到以下幾個方面:
核心線程數(corePoolSize):線程池的基本大小,即在沒有任務執行時線程池的大小,并且只有在工作隊列滿了之后才會創建超出這個數量的線程。
最大線程數(maximumPoolSize):線程池允許的最大線程數。
存活時間(keepAliveTime):當線程數大于核心線程數時,這個參數定義了超過核心線程數的線程在空閑時可以存活的時間。
時間單位(unit):keepAliveTime
參數的時間單位。
工作隊列(workQueue):用于保存等待執行的任務的阻塞隊列。
線程工廠(threadFactory):用于創建新線程的工廠。
拒絕策略(handler):當任務無法被接受時的處理策略。
以下是一個使用Executors
工廠類創建ExecutorService
的例子:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ThreadPoolExample {
public static void main(String[] args) {
// 創建一個核心線程數為2,最大線程數為5,空閑線程存活時間為10秒的線程池
ExecutorService executorService = new ThreadPoolExecutor(
2, // 核心線程數
5, // 最大線程數
10, // 空閑線程存活時間
TimeUnit.SECONDS, // 時間單位
new LinkedBlockingQueue<>(10), // 工作隊列
Executors.defaultThreadFactory(), // 線程工廠
new ThreadPoolExecutor.AbortPolicy() // 拒絕策略
);
// 提交任務到線程池
for (int i = 0; i < 15; i++) {
final int taskNumber = i;
executorService.submit(() -> {
System.out.println("Task " + taskNumber + " is running on thread " + Thread.currentThread().getName());
try {
Thread.sleep(2000); // 模擬任務執行時間
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("Task " + taskNumber + " is completed");
});
}
// 關閉線程池
executorService.shutdown();
}
}
在這個例子中,我們創建了一個ThreadPoolExecutor
實例,它允許最多5個線程同時運行,并且有一個容量為10的任務隊列。當隊列滿了之后,如果還有新的任務提交,線程池會嘗試創建新的線程,直到達到最大線程數。如果超過了最大線程數,新的任務將會根據拒絕策略進行處理。
請注意,當不再需要ExecutorService
時,應該調用shutdown()
方法來優雅地關閉線程池,這樣可以確保所有已提交的任務都得到執行,并且線程池中的線程能夠正常退出。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。