我那时喜欢的是黄昏、荒郊和忧伤,而如今则向往清晨、市区和宁静。——博尔赫斯
这里用一个Set
去接收并行流产生的线程id
,对于上方的reduce
函数我之前一篇博客已经讲过了,今天就来论证一下,到底并行流的线程数是否和JVM
虚拟机可用的处理器数一致:
代码如下:
代码语言:javascript复制List<Integer> list = Stream.generate(() -> 1).limit(100).collect(Collectors.toList());
System.out.println(list);
int sum = list.parallelStream().reduce(1, Integer::sum, (a, b) -> {
System.out.println(Thread.currentThread().getId() " " Thread.currentThread().getName() " parallelStream执行sum时上次结果:[" a "]本次值:[" b "]");
return Integer.sum(a, b);
});
Set<Long> threadIdSet = list.parallelStream().mapMultiToLong((i, c) -> c.accept(Thread.currentThread().getId())).collect(() -> Collections.synchronizedSet(new HashSet<>()), Set::add, Set::addAll);
System.out.println("结果:" sum);
System.out.println("线程数:" threadIdSet.size());
System.out.println("Java 虚拟机可用的处理器数:" Runtime.getRuntime().availableProcessors());
运行结果如下: