gpt4 book ai didi

java - ExecutorCompletionService 和 FixThreadPool 执行器之间的区别

转载 作者:行者123 更新时间:2023-11-30 05:33:36 26 4
gpt4 key购买 nike

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

谢谢。

最佳答案

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

CompletionService arranges that submitted tasks are, upon completion, placed on a queue.

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

提交给 FixedThreadPoolCompletionService 的所有任务都将并行完成,而不保持顺序。

当您需要知道所有任务何时完成时,可以使用

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 之间的区别。当您需要保持线程 Activity 并限制其数量时,通常使用第一个。秒数受系统限制,它将并行处理尽可能多的线程。如果 CachedThreadPool 中的线程处于空闲状态,则超时后(默认为 60 秒),该线程将被自动删除。

关于java - ExecutorCompletionService 和 FixThreadPool 执行器之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57057843/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com