简体   繁体   中英

CompletableFuture and Garbage Collection

I'd like to fire many one-off async CompletableFutures, like so:

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

Ideally these CompletableFutures could be garbage collected after whenComplete has finished. But is there a risk they are collected beforehand, since I'm not storing a reference?

You're not explicitly storing a reference, but supplyAsync is, internally. The method creates a CompletableFuture and submits a task to the ForkJoinPool (if you're using the common pool) that has a reference back to it. The CompletableFuture returned by whenComplete becomes a dependent on that first CompletableFuture and so is also referenced.

All these objects will be available for garbage collection once the ForkJoinPool completes execution of the Supplier , marks the first CompletableFuture as complete, triggers the second CompletableFuture , and executes the BiConsumer passed to whenComplete .

You're safe.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM