首页 > 解决方案 > CompletableFuture 和垃圾收集

问题描述

我想触发许多一次性异步 CompletableFutures,如下所示:

for (Job job : jobs) {
 CompletableFuture.supplyAsync(() -> job.process())
   .whenComplete(this::doSomething);
}

理想情况下,这些 CompletableFuture 可以在whenComplete完成后进行垃圾收集。但是由于我没有存储参考,因此是否存在预先收集它们的风险?

标签: javaasynchronousgarbage-collectioncompletable-future

解决方案


您没有显式存储引用,而是supplyAsync在内部存储。该方法创建 aCompletableFuture并将任务提交给ForkJoinPool(如果您使用的是公共池),该任务具有对它的引用。CompletableFuture返回的 by成为whenComplete依赖于第一个CompletableFuture,因此也被引用。

ForkJoinPool一旦完成执行,所有这些对象都将可用于垃圾回收Supplier,将第一个标记CompletableFuture为完成,触发第二个CompletableFuture,并执行BiConsumer传递给whenComplete

你安全了。


推荐阅读