我正在研究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/