假设您有一组任务,
A, B, C, D, E并且要在中异步执行每个任务,并在
Executor完成时按1逐个处理结果。
使用
Executor,您将像这样:
List<Future<?>> futures = new ArrayList<Future<?>>();futures.add(executorService.submit(A));futures.add(executorService.submit(B));futures.add(executorService.submit(C));futures.add(executorService.submit(D));futures.add(executorService.submit(E));//This loop must process the tasks in the order they were submitted: A, B, C, D, Efor (Future<?> future:futures) { ? result = future.get(); // Some processing here}
这种方法的问题是不能保证任务
A将首先完成。因此,当主线程
A可能正在处理另一个任务(例如task
B)的结果时,它有可能阻塞空闲地等待任务完成。使用可以减少结果处理的等待时间
ExecutorCompletionService。
List<Future<?>> futures = new ArrayList<Future<?>>();futures.add(executorCompletionService.submit(A));futures.add(executorCompletionService.submit(B));futures.add(executorCompletionService.submit(C));futures.add(executorCompletionService.submit(D));futures.add(executorCompletionService.submit(E));//This for loop will process the tasks in the order they are completed, //regardless of submission orderfor (int i=0; i<futures.size(); i++) { ? result = executorCompletionService.take().get(); // Some processing here}
因此,从本质上讲,
ExecutorCompletionService当处理任务结果的顺序无关紧要时,可以用于提高效率。
需要注意的重要一件事。ExecutorCompletionService的实现包含一个结果队列。如果不调用
take或
poll耗尽该队列,将发生内存泄漏。某些人使用
Futurereturn
by
submit处理结果,这不是正确的用法。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)