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