执行器和执行器之间的区别在java中完成服务

正如问题标题本身所说,Java中的Exector和ExecutorCompletionService类之间有什么区别?

我是线程的新手,所以如果有人可以用一段代码解释,那将有很大帮助。


答案 1

假设您有一组任务,并且您希望在 中异步执行每个任务,并在结果完成时逐个处理结果。A, B, C, D, EExecutor

使用 ,您可以按如下方式执行此操作: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, E
for (Future<?> future:futures) {
    ? result = future.get();
    // Some processing here
}

此方法的问题在于无法保证任务将首先完成。因此,当主线程可能正在处理另一个任务(例如任务)的结果时,主线程可能会无所事事地阻塞等待任务完成。通过使用 .AABExecutorCompletionService

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 order
for (int i=0; i<futures.size(); i++) {
    ? result = executorCompletionService.take().get();
    // Some processing here
}

因此,从本质上讲,当处理任务结果的顺序无关紧要时,可以用来挤出更多的效率。ExecutorCompletionService

不过有一件重要的事情要注意。ExecutorCompletionService 的实现包含一个结果队列。如果未调用 或 未调用 来清空该队列,则会发生内存泄漏。有些人使用返回的 by 来处理结果,这不是正确的用法。takepollFuturesubmit


答案 2

一个将简单地包装并委托给一个正常,并提供方便的方法来检索最近完成的任务。ExecutorCompletionServiceExecutor

API有几个例子,应该会让你去

http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ExecutorCompletionService.html