开发者社区> 问答> 正文

为什么parallelStream在将它们包装在ArrayList中,在可以工作时并没有运行?

哈希图具有两个键和值对,它们不会由不同的线程并行处理。

import java.util.stream.Stream;
import java.util.Map;
import java.util.HashMap;

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        Map<String, Integer> map = new HashMap<>();
        map.put("a", 1);
        map.put("b", 2);
        map.values().parallelStream()
              .peek(x -> System.out.println("processing "+x+" in "+Thread.currentThread()))
              .forEach(System.out::println);
    }
}

输出:

processing 1 in Thread[main,5,main]
1
processing 2 in Thread[main,5,main]
2

网址:https://ideone.com/Hkxkoz

ValueSpliterator应该尝试将HashMap数组拆分为大小为1的插槽,这意味着应在不同的线程中处理两个元素。

来源:https : //www.codota.com/code/java/methods/java8.util.HMSpliterators $ ValueSpliterator /%3Cinit%3E

将它们包装后ArrayList,它会按预期工作。

new ArrayList(map.values()).parallelStream()
              .peek(x -> System.out.println("processing "+x+" in "+Thread.currentThread()))
              .forEach(System.out::println);

输出:

processing 1 in Thread[ForkJoinPool.commonPool-worker-3,5,main]
1
processing 2 in Thread[main,5,main]
2

展开
收起
垚tutu 2019-11-28 18:50:18 662 0
0 条回答
写回答
取消 提交回答
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载