假设我们有以下代码:
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次期货进行一次日志记录。 有人知道什么主意吗?