My situation is quite simple.
I have a list I want to perform logic on each item asynchronically.
when all the threads are done, i want to call a close connection.
like so:
bucketsList.parallelStream().forEach(t -> {
//some logic
});
try {
RestApi.getInstance().closeClientConnection();
} catch (IOException e) {
e.printStackTrace();
}
is there a way to make the closeConnection part wait for the parallel Stream to finish going through all of its objects?
EDIT: I cannot use CountDownLatch
as i dont know how many items i will have in bucketsList
An operation on a ParallelStream
is still blocking and will wait for all the threads it spawned to finish. These threads are executed asynchronously (they don't wait for a previous one to finish), but that doesn't mean your whole code starts behaving asynchronously !
If you're actually making asynchronous calls and working on the resulting CompletableFuture<T>
in your forEach
, you should instead make your terminal operation a reduce
producing a single CompletableFuture<T>
. Intermediate operations could be a peek
or an identity map
with side-effects (both are frowned upon, but I don't know any best-practice solution). You would close the connection upon resolve of the single resulting CompletableFuture<T>
.
If you're not, then your code looks good enough, as the closeClientConnection()
will only be executed once the ParallelStream
has been processed.
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.