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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With