如何从Executor Service有效地处理多个结果

时间:2011-09-07 15:55:37

标签: java multithreading executorservice callable futuretask

我是ExecutorService的新手,但我不确定我的方法。 对于已知任务,我可以处理多达100个线程。 我正在使用下面的通用格式,在那里我创建了FutureTasks列表,然后将它们提交给ExecutorService。 ExecutorService返回并将这些挂起的结果添加到另一个列表中。 然后我遍历这个列表,在每个挂起的结果上调用get()。

我的查询是:在所有100个线程完成之前,是否会依次阻止每个get()?有一个更好的方法吗 ?

我是否正确假设get()返回Callable实现的call()方法的结果?我正在使用默认的FutureTask类,并没有将其子类化。

ExecutorService exec = Executors.newFixedThreadPool( NUM_THREADS );

List<JobClass> originalList = new ArrayList<JobClass>();

List<SomeOtherClass> pendingResult = new ArrayList<SomeOtherClass>();

List<Future<SomeOtherClass>> resultList = new ArrayList<Future<SomeOtherClass>>();

for( JobClass sc : originalList )
    pendingResult.add( submit( sc );

for( Future<SomeOtherClass> future : futures )
    resultList.add( future.get(5, TimeUnit.SECONDS) ); 

2 个答案:

答案 0 :(得分:5)

好问题,如果我理解正确,你会担心消耗已完成任务的结果。是的,线程将阻止。 Java的答案是使用CompletionService

如文档页面“将新异步任务的生成与已完成任务的结果消耗分离的服务”中所述。

答案 1 :(得分:2)

如果您只在完成所有任务后继续操作,则可以按照建议执行操作。任务完成的顺序无关紧要。但是,如果您需要尽快将任务结果传递给其他处理器或在执行任务时执行其他操作,您可能需要先使用isDone方法检查任务是否完成,然后调用{{ 1}}如果它是完整的。