关于如何并行处理此处理的想法(Java8 期货)?

Ideas on how to parallelize this processing (Java8 Futures)?

我们继承了一些对期货队列进行串行处理的代码。我想通过 运行 并行处理来加快速度,但我无法弄清楚如何正确增加我们在处理时需要跟踪的成功/失败计数。

这是以前存在的:

private void flushFutures(final Queue<Future<State>> futures) {
   final Map<String, Integer> someMapA = new HashMap<>();

   while(!futures.isEmpty()) {
      final Future<State> future = futures.poll();

      final State state = future.get();
      switch (state) {
         case SOME_CASE_A:
             // modify someMapA
             break;
         case SOME_CASE_B:
             // modify someMapB
             break;
         //.....
      } 
   }
}

所以我尝试用 a:

替换 while 循环

futures.parallelStream().forEach(future -> ...) 但这给我留下了从 lambda 中改变状态的问题。

有没有人告诉我如何更好地处理这些 futures 来做与它目前正在做的事情相同的事情,但是顺序进行,而不是将 future 乱七八糟地添加回集合中?

而不是使用 forEach,您可以在 futures.get() 上执行 map,然后使用并发哈希映射执行 "groupBy" 收集器。

参见: