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中有多少项目
对a的操作ParallelStream仍在阻塞,并将等待它产生的所有线程完成.这些线程是异步执行的(它们不等待前一个线程完成),但这并不意味着您的整个代码开始异步运行!
如果你实际进行异步调用和产生的工作CompletableFuture<T>在你的forEach,你应该反而让你的终端操作的reduce生产单CompletableFuture<T>.中间操作可能是副作用的一个peek或一个身份map(两者都不赞成,但我不知道任何最佳实践解决方案).您将在解决单个结果后关闭连接CompletableFuture<T>.
如果你不是,那么你的代码看起来就足够了,因为closeClientConnection()只有ParallelStream在处理后才会执行.