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