我那时喜欢的是黄昏、荒郊和忧伤,而如今则向往清晨、市区和宁静。——博尔赫斯

这里用一个Set去接收并行流产生的线程id,对于上方的reduce函数我之前一篇博客已经讲过了,今天就来论证一下,到底并行流的线程数是否和JVM虚拟机可用的处理器数一致:

代码如下:

1
2
3
4
5
6
7
8
9
10
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());

运行结果如下:

image-20210914183107212