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

谢谢。

最佳答案

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


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


这意味着,所有提交任务的结果都将在队列中,您可以稍后对其进行处理。
将任务提交给CompletionService时,它会创建包装器,因此异步任务的结果将保存到队列中。它本身并不会创建并行机制,而是CompletionServiceExecutor内部使用了并行线程。例如,您可以在内部传递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之间的区别。第一个通常在需要保持线程活动并限制其数量时使用。秒受系统限制,它将并行处理尽可能多的线程。如果线程在CachedThreadPool中处于空闲状态,则超时后将自动删除该线程(默认为60秒)。

09-25 22:24