【发布时间】:2020-08-04 02:33:47
【问题描述】:
我有一个函数/任务 void task() 需要调用大约 4-6 百万次。
我想在线程池中的线程上并行化此操作。
我不关心任务的返回值,所以我可以避免搞乱Future<T>。
我想定期轮询线程如何进行的状态。状态只是有多少次task() 调用干净返回,有多少次抛出异常。
这是我想出的:
class Test {
AtomicInteger success = new AtomicInteger(0);
AtomicInteger failed = new AtomicInteger(0);
CountDownLatch latch = new CountDownLatch(1_000_000);
private void start() {
ExecutorService executorService = Executors.newFixedThreadPool();
for (int i = 0; i < 1_000_000; i++) {
executorService.execute(this::task);
}
while (!countDownLatch.await(1, TimeUnit.SECONDS)) {
log("Success: %d Failed: %d", success.get(), failed.get());
}
log("===================== Final tally =====================");
log("Success: %d Failed: %d", success.get(), failed.get());
executorService.shutdown();
}
private void task() {
try {
doSomeStuff();
success.incrementAndGet()
} catch(Exception e) {
failed.incrementAndGet();
}
countDownLatch.countDown();
}
}
两个AtomicInteger,线程用来记录成功或失败,一个CountDownLatch,“监控”线程用来检查进度。
有没有更惯用的方法来做到这一点?一些不涉及向ExecutorService 提交数百万个Runnable lambda 的事情?
我可以把整个东西放在一个
IntStream.range(0, 1_000_000).parallelStream().map(...).groupBy(...)
但我无法监控进度。
【问题讨论】:
标签: java multithreading executorservice