Java执行程序:等待任务终止。

我需要提交一些任务,然后等待它们,直到所有结果都可用。它们中的每一个都会将 a 添加到 (默认情况下已同步)。然后,我需要为Vector中的每个结果启动一个新任务,但只有当所有以前的任务都停止工作时,我才需要这样做。StringVector

我想使用Java Executor,特别是我尝试使用以使用固定数量的线程(我有一个可变数量的任务,可以是10或500),但我是执行器的新手,我不知道如何等待任务终止。这类似于我的程序需要做的伪代码:Executors.newFixedThreadPool(100)

ExecutorService e = Executors.newFixedThreadPool(100);
while(true){

/*do something*/

for(...){
<start task>
}

<wait for all task termination>

for each String in result{
<start task>
}

<wait for all task termination>
}

我无法进行e.shutdown,因为我在一段时间内(真实),我需要重用...executorService

你可以帮我吗?你能给我推荐一本关于java执行器的指南/书吗?


答案 1

为您提供了一种同时执行多个任务并取回对象集合(表示任务的异步计算)的机制。ExecutorServiceFuture

Collection<Callable<?>> tasks = new LinkedList<Callable<?>>();
//populate tasks
for (Future<?> f : executorService.invokeAll(tasks)) { //invokeAll() blocks until ALL tasks submitted to executor complete
    f.get(); 
}

如果你有 s 而不是 s,你可以很容易地把 a 变成一个 using 方法:RunnableCallableRunnableCallable<Object>

Callable<?> c = Executors.callable(runnable);

答案 2

你能给我推荐一本关于java执行器的指南/书吗?

我可以回答这部分:

Brian Goetz(与Tim Peierls,Joshua Bloch,Joseph Bowbeer,David Holmes和Doug Lea合作)的Java Concurrency in Practice很可能是你最好的选择。

不仅涉及执行器,而且还涵盖了一般的包,以及基本的并发概念和技术,以及一些高级主题,例如Java内存模型。java.util.concurrent


推荐