java - ParallelStream 如何处理异常?

标签 java parallel-processing

我正在研究java中的并行流。我的代码非常简单,一个 map 包含两个键。我想并行调用 forEach 键的函数。 现在,关键函数之一引发了异常。

我无法理解为什么第二个键的函数没有执行。

map.put(1,1);     
map.put(2,2);
map.entrySet().parallelStream()
                    .map(batch -> function(batch.getKey()))
                    .collect(Collectors.toList());


f(key)
      if(key==1) throw new Exception();
      System.out.print("printing: "key)

最佳答案

如果您的 Stream 只有两个元素,则流框架可能不会创建两个线程来处理这两个元素。因此,一旦第一个元素抛出异常,第二个元素将不会被处理。

实际上,当我尝试与您类似的代码时,但没有异常(exception),我发现这两个元素实际上是在 main 线程上处理的:

public static int function(int key) {
    System.out.print("printing: " + key + " " + Thread.currentThread ().getName () + " ");
    return key;
}

public static void main (java.lang.String[] args)
{
    HashMap<Integer,Integer> map = new HashMap<>();
    for (int i = 1 ; i <= 2 ; i ++) {
        map.put(i,i);     
    }

    map.entrySet().parallelStream()
                  .map(batch -> function(batch.getKey()))
                  .collect(Collectors.toList());
}

此输出:

printing: 1 main printing: 2 main

只有当Stream较大时,工作才会分成多个线程,因此一个元素抛出的异常不会影响其余元素的处理。

如果我将 Stream 的大小增加到 5,我会得到:

printing: 1 ForkJoinPool.commonPool-worker-1 printing: 2 ForkJoinPool.commonPool-worker-1 printing: 3 ForkJoinPool.commonPool-worker-1 printing: 4 main printing: 5 main

所以现在工作分为两个线程。

如果我为第一个元素抛出一个 RuntimeException ,我会得到:

printing: 4 main printing: 5 main Exception in thread "main" java.lang.RuntimeException

如您所见,分配给抛出异常的线程的元素没有被处理,但分配给另一个线程的元素被处理。

关于java - ParallelStream 如何处理异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53428299/

相关文章:

java - 使用实体属性更新文档而不是替换它(保留未映射的属性)

java - 鼠标坐标不断叠加-Java

java - 使用主线程读取文件并使用多线程和ExecutorService处理数据

c++ - 在 OpenMP 中使用共享数据结构而不是私有(private)数据结构时的性能差异

java - JVM 是否具有检测并行化机会的能力?

java - 我的代码中不断出现错误 "java.util.InputMismatchException"

java - 如何创建 Android 通知?

arrays - Repa 阵列上的并行 mapM

r - 如何在 Windows 下使用 doMC 或 glmnet 的替代并行处理实现?

c - MPI 中派生数据类型的范围