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()
时,如果等待队列已满,此时线程池已取过任务在满负荷执行,当前线程将阻塞地等待队列有空闲。