我想使用线程池来处理项目列表,然后等待它们完成。如果没有完成,我还需要能够在处理4分钟后将其计时。
这就是我现在所拥有的
ForkJoinPool threadPool = new ForkJoinPool(Runtime.getRuntime().availableProcessors() * 2);
list.forEach(entry -> threadPool.execute(() -> {
// processing
}));
if (!threadPool.awaitQuiescence(4, TimeUnit.MINUTES)) {
// send alert about delay
}
问题在于,有时这种方法会使用主线程来处理其中一个列表项,这意味着awaitQuiescence在完成之前不会启动。是否有任何其他线程池允许类似但保证不使用主线程或有没有办法配置ForkJoinPool?
答案 0 :(得分:0)
我认为问题是你仍然在主线程中迭代(list.forEach
)。使用并行流并将整个计算委派给您的池:
ForkJoinPool pool = new ForkJoinPool(Runtime.getRuntime().availableProcessors() * 2);
pool.execute(() -> {
list.parallelStream().forEach(item -> {
// processing
});
});
if (!pool.awaitQuiescence(4L, TimeUnit.MINUTES)) {
// send alert about delay
}
我建议阅读this question(以及给定的答案),了解如何使用ForkJoinPool
和并行流。