据我所知,执行者完成服务会提供将来对象的输出,而与入站队列中任务的请求顺序无关,即无论哪个任务先完成,结果都将放入出站队列。另一方面,FixedThreadPool
也并行执行任务,那么两者有什么区别? (不确定FixedThreadPool
是否按照任务被送入入站队列的顺序顺序输出)
谢谢。
最佳答案
FixedThreadPool
是Executor
的变体之一。它对ThreadPoolExecutor
和corePoolSize
使用具有相同值的类maximumPoolSize
。这意味着,如果创建具有10个线程的FixedThreadPool
,它将始终保留精确的10个线程。如果这些线程中的任何一个由于运行任务而终止,则线程池将创建新线程以保留所需数量。
CompletionService安排将提交的任务完成后放在队列中。
这意味着,所有提交任务的结果都将在队列中,您可以稍后对其进行处理。
将任务提交给CompletionService
时,它会创建包装器,因此异步任务的结果将保存到队列中。它本身并不会创建并行机制,而是CompletionService
在Executor
内部使用了并行线程。例如,您可以在内部传递FixedThreadPool
。
提交给FixedThreadPool
和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
。另外,请注意
FixedThreadPool
和CachedThreadPool
之间的区别。第一个通常在需要保持线程活动并限制其数量时使用。秒受系统限制,它将并行处理尽可能多的线程。如果线程在CachedThreadPool
中处于空闲状态,则超时后将自动删除该线程(默认为60秒)。