java 8并行流,blockingcode可能吗?

sha*_*gur 1 java asynchronous java-stream

我的情况很简单.

我有一个列表,我想异步地对每个项目执行逻辑.

当所有线程都完成后,我想调用一个紧密的连接.

像这样:

bucketsList.parallelStream().forEach(t -> {
//some logic
});
 try {
 RestApi.getInstance().closeClientConnection();
 } catch (IOException e) {
     e.printStackTrace();
 }
Run Code Online (Sandbox Code Playgroud)

有没有办法让closeConnection部分等待并行Stream完成遍历所有对象?

编辑:我不能使用,CountDownLatch因为我不知道我将在bucketsList中有多少项目

Aar*_*ron 5

对a的操作ParallelStream仍在阻塞,并将等待它产生的所有线程完成.这些线程是异步执行的(它们不等待前一个线程完成),但这并不意味着您的整个代码开始异步运行!

如果你实际进行异步调用和产生的工作CompletableFuture<T>在你的forEach,你应该反而让你的终端操作的reduce生产单CompletableFuture<T>.中间操作可能是副作用的一个peek或一个身份map(两者都不赞成,但我不知道任何最佳实践解决方案).您将在解决单个结果后关闭连接CompletableFuture<T>.

如果你不是,那么你的代码看起来就足够了,因为closeClientConnection()只有ParallelStream在处理后才会执行.