gpt4 book ai didi

java - ParallelStream 如何处理异常?

转载 作者:行者123 更新时间:2023-11-30 05:54:24 81 4
gpt4 key购买 nike

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

81 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com