java重用执行器

dan*_*ann 6 java multithreading java.util.concurrent concurrent-programming

我在模拟系统上工作,在每个时间步,我必须模拟许多模型.我使用FixedThreadPool来加速计算:

ExecutorService executor = Executors.newFixedThreadPool(nThread);
for (Model m : models) {
  executor.execute( m.simulationTask() );
}
executor.shutdown();
while ( ! executor.awaitTermination(10, TimeUnit.MINUTES) ) { 
  System.out.println("wait"); 
}
Run Code Online (Sandbox Code Playgroud)

现在,执行程序execute()在调用后不能用于新任务shutdown().有没有办法重置执行程序,所以我可以在下一个模拟步骤中重用现有的执行程序(及其线程)?

Per*_*ion 7

如果在某种程度上重构代码,则可以重用执行程序服务.

Collection<Callable<Integer>> tasks = new ArrayList<Callable<Integer>>(16);
for (Model m : models) {
  tasks.add(m.simulationTask());
}

ExecutorService executor = Executors.newFixedThreadPool(nThread);
try {
  executor.invokeAll(tasks);
} catch(InterruptedException ie) {
  // Handle this
}
Run Code Online (Sandbox Code Playgroud)

基本上,您在继续之前收集所有任务,执行它们并等待执行.当然,您也可以为每个时间步骤使用新的Executor服务,但至少您可以选择.

注意事项:我没有编译代码,因此可能存在错误.为方便起见,我还假设了一个Integer参数类型.

  • 在进入下一步之前,您还没有展示如何等待所有任务完成。 (2认同)
  • @dogbane - `invokeAll` 等待所有任务完成。 (2认同)