java 8并行流,阻塞代码可能吗?

标签 java asynchronous java-stream

我的情况很简单。

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

当所有线程都完成后,我想调用一个关闭连接。

像这样:

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

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

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

最佳答案

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

如果您实际上是在进行异步调用并处理生成的 CompletableFuture<T>在你的forEach , 你应该让你的终端操作成为 reduce生产单CompletableFuture<T> .中间操作可以是 peek或身份 map有副作用(两者都不受欢迎,但我不知道任何最佳实践解决方案)。您将在解决单个结果 CompletableFuture<T> 时关闭连接.

如果不是,那么您的代码看起来就足够好了,因为 closeClientConnection()只会执行一次 ParallelStream已处理。

关于java 8并行流,阻塞代码可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44945521/

相关文章:

python - `asyncio.new_event_loop` 有哪些用例?

node.js - 为什么 async.filter() 不接受错误?

java - 在 java 中的 Collectors.groupingBy 之后展平 map

Java8 列表<T> 到列表<object[]>

java - Spring 中应用程序上下文和 Web 上下文中分别包含哪些 Bean?

java - 生成特定范围内的随机数

java - 访问自定义线程方法

java - 谷歌应用程序引擎和Android?

javascript - 防止代码在 forEach 之后执行

Java 8 嵌套流 : return a value in last stream