我那时喜欢的是黄昏、荒郊和忧伤,而如今则向往清晨、市区和宁静。——博尔赫斯
这里用一个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());
|
运行结果如下: