我的情况很简单。
我有一个列表,我想对每个项目异步执行逻辑。
当所有线程都完成后,我想调用一个关闭连接。
像这样:
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/