ExecutorCompletionService和FixedThreadPool执行程序之间的区别

时间:2019-07-16 12:59:04

标签: java multithreading concurrency

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

谢谢。

1 个答案:

答案 0 :(得分:1)

wmicFixedThreadPool的变体之一。它使用ExecutorThreadPoolExecutor具有相同值的类corePoolSize。这意味着,如果您创建具有10个线程的maximumPoolSize,它将始终保留确切的10个线程。如果这些线程中的任何一个被运行的任务终止,则线程池将创建新的线程以保持所需的数量。

  

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

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

所有提交给FixedThreadPoolFixedThreadPool的任务将并行执行,而不会保持顺序。

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

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 } 可以在任何其他情况下使用,如果您想并行处理线程而不必等待结果。

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