CompletableFuture and Garbage Collection

kantianethics :

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?

Sotirios Delimanolis :

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.

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=90311&siteId=1