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

Sco*_*cot 1 java multithreading callable executorservice 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) ); 
Run Code Online (Sandbox Code Playgroud)

unc*_*ons 5

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

正如文档页面"将新异步任务的生成与已完成任务的结果的消耗分离"的服务所述.