1

我是 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) ); 
4

2 回答 2

5

好问题,如果我理解正确,您担心消耗已完成任务的结果。是的,线程会阻塞。Java 对此的回答是使用CompletionService

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

于 2011-09-07T16:05:33.470 回答
2

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

于 2011-09-07T16:02:48.340 回答