我正在使用此代碼來劃分不同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
沒有超時,這是我想要的。 - 我需要做我自己的錯誤收集。
什麼是正確/常用的方法來做到這一點?
我關閉池,否則'awaitTermination'將無法正常工作。 – 2012-08-08 09:39:24
你也不需要做'awaitTermination'。 – artbristol 2012-08-08 09:40:04
@BartvanHeukelom如果你調用future.get(),它會阻塞,直到任務完成,所以當你關閉池時,所有的東西都將被終止。 – assylias 2012-08-08 09:41:00