Java 自帶的 Executors.newFixedThreadPool()
使用 LinkedBlockingQueue
存儲已提交但未處理的任務,這會導致批量處理時 ExecutorService 會短時間內存儲大量的任務在隊列中。
我們基於 ThreadPoolExecutor
和 ArrayBlockingQueue
實現了 newFixedThreadPool
的阻塞式提交任務版本:
private int THREAD_NUM = 4;
private ExecutorService executor = new ThreadPoolExecutor(
THREAD_NUM, THREAD_NUM,
0L, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<>(THREAD_NUM), // 未處理的任務的等待隊列
(r, executor) -> {
try {
executor.getQueue().put(r);
} catch (InterruptedException e) {
throw new RejectedExecutionException("interrupted", e);
}
}
);
在執行 executor.submit()
時,如果等待隊列已滿,此時線程池已取過任務在滿負荷執行,當前線程將阻塞地等待隊列有空閒。