【发布时间】:2021-04-07 22:09:28
【问题描述】:
我想使用 Java 8 Streams 提供的并行性,但我还需要以特定顺序完成某些操作,否则一切都会中断。问题是使用流意味着代码现在是异步的 [注意:这是不正确的],我无法弄清楚如何仅在完成对整个集合的迭代时才发生某些事情。 [注意:这是自动发生的]
现在,我的代码如下:
public void iterateOverMap(Map<String, String> m)
{
AtomicInteger count = new AtomicInteger(0);
m.keySet().stream().forEach((k) -> {
Object o = m.get(k);
// do stuff with o
count.incrementAndGet();
});
// spin up a new thread to check if the Stream is done
new Thread(() -> {
for (;;)
{
if (count.intValue() >= map.size())
break;
}
afterFinishedIterating();
}).start();
}
我不喜欢为了跟踪这件事而不得不启动一个新线程或阻塞主线程的想法,但我想不出我还能怎么做。有谁知道更好的选择吗?
谢谢!
【问题讨论】:
-
它不是异步的,它是并行的。同步和并行。它会在迭代完成后返回。另外,不要忙着等待。
-
@BoristheSpider 我只实现了计数器,因为在
forEach完成之前执行afterFinishedIterating()的程序出现问题。另外,显然我不应该忙着等待,但我应该怎么做呢? -
没有什么是异步的;我不知道你想解决什么问题。
-
另外,使用
Map#entrySet()而不是遍历键并重新获取每个条目。 -
@ABadHaiku 重读
Map#entrySet()的定义。您会看到每个Map.Entry<>都包含键和值。
标签: java foreach parallel-processing java-stream thread-synchronization