【问题标题】:Parallelize and monitor tasks with ExecutorService使用 ExecutorService 并行化和监控任务
【发布时间】: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


    【解决方案1】:

    如果您想按照您的建议使用流,您可以将监控部分移到另一个线程中,如下所示:

    new Thread(()->{  
     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());
    }).start()
    
    IntStream.range(0, 1_000_000).parallelStream().map(...).groupBy(...)
    

    【讨论】:

      猜你喜欢
      • 2017-04-16
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多