我想解雇许多一次性的异步CompletableFutures,如下所示:
for (Job job : jobs) {
CompletableFuture.supplyAsync(() -> job.process())
.whenComplete(this::doSomething);
}
理想情况下,这些CompletableFutures可以在whenComplete
完成后进行垃圾收集。但他们是否有预先收集的风险,因为我没有存储参考?
你没有明确地存储引用,但supplyAsync
是内部的。该方法创建一个CompletableFuture
并向ForkJoinPool
(如果您正在使用公共池)提交一个任务,该任务有一个返回它的引用。 CompletableFuture
返回的whenComplete
成为第一个CompletableFuture
的依赖,因此也被引用。
一旦ForkJoinPool
完成Supplier
的执行,所有这些对象将可用于垃圾收集,将第一个CompletableFuture
标记为完成,触发第二个CompletableFuture
,并执行传递给BiConsumer
的whenComplete
。
你安全了。