Java 固定线程数、阻塞式提交任务的 ExecutorService 线程池

原创
2017/07/13 15:40
阅读数 1K

Java 自带的 Executors.newFixedThreadPool() 使用 LinkedBlockingQueue 存储已提交但未处理的任务,这会导致批量处理时 ExecutorService 会短时间内存储大量的任务在队列中。

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

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部