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