我希望能够启动许多一次性的异步CompletableFutures,如下所示:
for (Job job : jobs) {
CompletableFuture.supplyAsync(() -> job.process())
.whenComplete(this::doSomething);
}
理想情况下,这些CompletableFuture在
whenComplete
完成后可以被垃圾回收。但是,如果我没有存储引用,它们会在此之前被回收吗?我希望能够启动许多一次性的异步CompletableFutures,如下所示:
for (Job job : jobs) {
CompletableFuture.supplyAsync(() -> job.process())
.whenComplete(this::doSomething);
}
whenComplete
完成后可以被垃圾回收。但是,如果我没有存储引用,它们会在此之前被回收吗?虽然你没有显式地存储引用,但是 supplyAsync
在内部会这样做。该方法创建一个 CompletableFuture
并向 ForkJoinPool
(如果你使用的是公共池)提交一个任务,该任务具有对该对象的引用。由 whenComplete
返回的 CompletableFuture
将成为第一个 CompletableFuture
的依赖项,因此也被引用。
所有这些对象将在 ForkJoinPool
执行 Supplier
、标记第一个 CompletableFuture
为完成、触发第二个 CompletableFuture
和执行传递给 whenComplete
的 BiConsumer
后可供垃圾回收。
你是安全的。
supplyAsync
的源代码,并确认提交给执行器的AsyncSupply<T>可运行对象持有对CompletableFuture的引用。 - kantianethics
main()
返回时,它们不需要被完成:https://dev59.com/aLLma4cB1Zd3GeqPea3I - user202729