Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java 8 parallel stream, blockingcode possible?

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

like image 895
sharon gur Avatar asked Dec 19 '22 06:12

sharon gur


1 Answers

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.

like image 50
Aaron Avatar answered Jan 10 '23 14:01

Aaron