在Java中,當ExecutorService無法處理新提交的任務時,會拋出RejectedExecutionException異常。為了解決這個問題,可以根據具體需求選擇合適的拒絕策略。以下是四種內置的拒絕策略:
要使用這些策略,需要創建一個ThreadPoolExecutor實例,并在其構造函數中傳入一個RejectedExecutionHandler實例。以下是一個示例:
import java.util.concurrent.*;
public class RejectedExecutionHandlerExample {
public static void main(String[] args) {
int corePoolSize = 2;
int maximumPoolSize = 4;
long keepAliveTime = 10;
TimeUnit unit = TimeUnit.SECONDS;
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(10);
// 創建一個拒絕策略
RejectedExecutionHandler rejectedExecutionHandler = new ThreadPoolExecutor.CallerRunsPolicy();
// 創建一個線程池
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
corePoolSize,
maximumPoolSize,
keepAliveTime,
unit,
workQueue,
Executors.defaultThreadFactory(),
rejectedExecutionHandler
);
// 提交任務
for (int i = 0; i < 10; i++) {
int finalI = i;
threadPoolExecutor.submit(() -> {
System.out.println("Task " + finalI + " is running on thread " + Thread.currentThread().getName());
});
}
// 關閉線程池
threadPoolExecutor.shutdown();
}
}
在這個示例中,我們創建了一個包含2個核心線程和最大4個線程的線程池。當提交第11個任務時,因為隊列已滿,所以新任務會被拒絕。我們使用了CallerRunsPolicy策略,直接在調用者線程中運行被拒絕的任務。這樣可以讓調用者線程等待任務執行完成,從而避免程序崩潰。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。