CompletableFuture:我们能否登录或知道完成了多少期货?

时间:2019-01-22 11:32:08

标签: java multithreading completable-future

假设我们有以下代码:

 List<Object> objects = ...
 CompletableFuture.allOf(objets.stream().map(d -> makeFuture(d, executorService))
            .toArray(CompletableFuture[]::new))
            .whenCompleteAsync((r, throwable) -> {
                if (throwable != null) {
                    // err
                }
                executorService.shutdown();
            }, executorService)

makeFuture如下所示:

private CompletableFuture<?> makeFuture(Object obj, ExecutorService executorService) {
    return CompletableFuture.runAsync(() -> {
        try {
            // do the job
            }
        } catch (Throwable t) {
            // err
        }
    }, executorService);
}

所以,我的问题是:我们能否知道每分钟完成多少期货或每(例如)100个期货完成时记录? 我看到有一个“全局”原子变量的选项,可以在makeFuture()方法中使用它,例如:

AtomicInteger count = new AtomiInteger()
....
private CompletableFuture<?> makeFuture(Object obj, ExecutorService executorService) {
return CompletableFuture.runAsync(() -> {
    try {
        // job
        if (count.incrementAndGet()) % 100 = 0) {
            log.info("{} futures are completed", count.get())
        }
    } catch (Throwable t) {
        // err
    }
}, executorService);

}

但是我不太喜欢这个主意。在这种情况下,我们必须同步操作。当然,我们可以创建一个本地long变量,并将AtomicLong值分配给该变量并将其记录下来,但是我不确定在makeFuture方法中存储本地变量。可能有数十万个makeFuture()调用。 对我来说,每N分钟进行一次日志记录更可取,然后每完成N次期货进行一次日志记录。 有人知道什么主意吗?

0 个答案:

没有答案