我正在使用这段代码在不同的 CPU 内核之间分配数百个任务。
final List<Throwable> errors = Collections.synchronizedList(Lists.<Throwable>newArrayList());
final ExecutorService pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
for (...) {
pool.execute(new Runnable() { @Override public void run() {
try {
// TASK HERE
} catch (Throwable e) {
errors.add(e);
}
}});
}
pool.shutdown();
try {
pool.awaitTermination(1000, TimeUnit.DAYS); // wait "indefinitely"
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
if (!errors.isEmpty()) throw Exceptions.wrap(errors.get(0)); // TODO multi-exception
它有效,但它并不好。
awaitTermination
没有没有超时的版本,这就是我想要的。- 我需要自己收集错误。
执行此操作的正确/常用方法是什么?
最佳答案
线程池的重点是重用线程。您应该在应用程序启动时在创建任务的代码之外创建它,然后注入(inject)它。添加任务后无需关闭池。当您的应用程序关闭时,您会这样做。
要运行一组任务,请使用 ExecutorService.invokeAll
。要在之后获得结果,请对每个返回的 Futures
调用 get
。它会重新抛出任务抛出的任何异常,因此您可以在之后收集它。
关于java - 如何正确地多线程独立任务的集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11861634/