Java 8 并行流,是否可能出现阻塞代码?

8

我的情况非常简单。

我有一个列表,想对每个项目进行异步逻辑操作。

当所有线程完成后,我想调用关闭连接的函数。

如下所示:

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

有没有方法让closeConnection部分等待并行流(parallel Stream)遍历完其所有对象?

编辑: 我无法使用CountDownLatch,因为我不知道bucketsList中会有多少项。

1个回答

14
一次 ParallelStream 操作仍然是阻塞的,它会等待所有生成的线程完成。这些线程是异步执行的(它们不会等待前一个线程完成),但这并不意味着你的整个代码开始异步执行!
如果你实际上正在进行异步调用,并在forEach中处理返回的 CompletableFuture<T> , 那么你应该将终端操作改为生成单个 CompletableFuture<T>reduce。 中间操作可以是带有副作用的 peek 或身份 map(两者都不被赞成,但我不知道任何最佳实践解决方案)。一旦单个结果的 CompletableFuture<T> 解析完成,就可以关闭连接。
如果你没有在进行异步调用,那么你的代码看起来已经足够好了,因为只有在处理完ParallelStream后才会执行 closeClientConnection()

您说得对!看来我遇到了一个不同的问题,它重置了我的计数器(我的逻辑也是异步的,我手动管理以了解还有多少请求正在运行)。一旦我解决了重置计数器的问题,这段代码就可以工作了! - sharon gur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接