首页 > 解决方案 > 动态扩展线程数的 Java ExecutorService

问题描述

我有一个工作单元列表,我想并行处理它们。每个单元工作 8-15 秒,完全计算时间,没有 I/O 阻塞。我想要实现的是ExecutorService

就像是:

Queue<WorkResult> queue = new ConcurrentLinkedDeque<>();
ExecutorService service = ....
for(WorkUnit unit : list) {
    service.submit(() -> {
        .. do some work ..
        queue.offer(result);
    );
}
while(queue.peek() != null) {
    ... process results while they arrive ...
}

我没有成功的尝试是:

我确信有官方实现来处理这个非常基本的并发用例。有人可以建议吗?

标签: javamultithreadingjava.util.concurrent

解决方案


最简单的方法是使用该方法

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)

Executors。这为您提供了一个简单的开箱即用解决方案。您获得的池将根据需要扩大和缩小。您可以使用处理核心线程超时等的方法进一步配置它
。ScheduledExecutorService 是 ExecutorService 类的扩展,是唯一一个开箱即用的可以动态扩展和收缩的类。


推荐阅读