我有一个场景,在这个场景中,我必须为同一个可调用的线程异步执行5个线程。据我所知,有两种选择:
1)使用submit(可调用)
ExecutorService executorService = Executors.newFixedThreadPool(5);
List<Future<String>> futures = new ArrayList<>();
for(Callable callableItem: myCallableList){
futures.add(executorService.submit(callableItem));
}2)使用invokeAll(可调用集合)
ExecutorService executorService = Executors.newFixedThreadPool(5);
List<Future<String>> futures = executorService.invokeAll(myCallableList));发布于 2016-01-14 19:57:28
选项1:您将任务提交给ExecutorService,而不是等待已提交给ExecutorService的所有任务的完成
选项2:您正在等待已提交给ExecutorService的所有任务的完成。
什么应该是首选的方式?
根据应用程序的需求,它们中的任何一个都是首选。
ExecutorService之后等待,请选择Option 1。ExecutorService的所有任务的完成,请选择Option 2。与另一种相比,它们中的任何一种是否有任何不利之处或性能影响?
如果应用程序需要选项2,则必须等待提交给ExecutorService的所有任务完成,这与选项1不同。性能不是比较的标准,因为两者都是为两个不同的目的设计的。
还有一件更重要的事情:无论您喜欢什么选项,FutureTask都会在任务执行期间吞下异常。你一定要小心。看看这个SE问题:处理ThreadPoolExecutor的异常
使用Java 8,您还有一个选项:ExecutorCompletionService
使用提供的执行器执行任务的CompletionService。这个类安排提交的任务在完成后放置在一个队列中,该队列可以使用“取”访问。该类足够轻量级,适合在处理一组任务时使用。
https://stackoverflow.com/questions/34440604
复制相似问题