繁体   English   中英

ExecutorCompletionService 和 FixedThreadPool 执行器的区别

[英]Difference between a ExecutorCompletionService and a FixedThreadPool executor

据我所知,无论任务在入站队列中的请求顺序如何,执行器完成服务都提供未来对象的输出,即无论哪个任务先完成,结果都被放入出站队列。 另一方面, FixedThreadPool也是并行执行任务,那么两者有什么区别呢? (不确定FixedThreadPool是否按照任务被送入入站队列的顺序依次给出输出)

谢谢。

FixedThreadPoolExecutor的变体之一。 它使用类ThreadPoolExecutorcorePoolSizemaximumPoolSize相同值。 这意味着,如果您创建具有 10 个线程的FixedThreadPool ,它将始终保持精确的 10 个线程。 如果这些线程中的任何一个因运行任务而终止 - 线程池将创建新线程以保持所需数量。

CompletionService 安排提交的任务在完成后放入队列。

这意味着,提交任务的所有结果都将在队列中,您可以稍后处理它们。 当您向CompletionService提交任务时,它会创建一个包装器,因此异步任务的结果将保存到队列中。 它本身不会创建并行性,而是CompletionServiceExecutor内部使用来创建并行线程。 例如,您可以在内部传递FixedThreadPool

所有提交到FixedThreadPoolCompletionService任务将并行完成,不保持顺序。

当您需要知道所有任务何时CompletionService可以使用CompletionService 例子:

//Task extends Callable<Result>
List<Task> tasks = new ArrayList<Task>();
CompletionService<Result> cs = new ExecutorCompletionService<Result>(Executors.newFixedThreadPool(10));
tasks.forEach(task -> cs.submit(task));
for (int i = 0; i < tasks.size(); i++) { // you should know exact amount of submitted tasks
    Result r = cs.take().get();
    //process r
}

FixedThreadPool可用于任何其他情况,当您想在不等待结果的情况下并行线程时。

另外,请注意FixedThreadPoolCachedThreadPool之间的区别。 第一个通常在您需要保持线程活动并限制线程数量时使用。 秒数受系统限制,它会并行处理尽可能多的线程。 如果一个线程在CachedThreadPool中处于空闲状态,它会在超时后被自动删除(默认为 60 秒)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM