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().有没有办法重置执行程序,所以我可以在下一个模拟步骤中重用现有的执行程序(及其线程)?
如果在某种程度上重构代码,则可以重用执行程序服务.
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参数类型.