//並行流計算1-100的和
Integer sum = IntStream.rangeClosed(1, 100).boxed().parallel().collect(Collectors.summingInt(n -> n));
System.out.println(sum);
//第二種寫法
Integer twoSum = Stream.iterate(1, n -> n + 1).limit(100).parallel().reduce(0, Integer::sum);
System.out.println(twoSum);
/**
* 對比:
* IntStream.rangeClosed直接產生原始類型的int數字,沒有裝箱拆箱的開銷。
* IntStream.rangeClosed會生成數字範圍,很容易拆分爲獨立的小塊。例如,範圍1~20
* 可分爲1~5、6~10、11~15和16~20。
* iterate生成的是裝箱的對象,必須拆箱成數字才能求和;很難把iterate分成多個獨立塊來並行執行。
* 總結:並行流只能用原始類型流,不能使用Stream.iterate,不然不僅快不了,還給順序處理增加了開銷
*/
/**
* 並行流內部使用了默認的ForkJoinPool(分支/合併框架),它默認的
* 線程數量就是你的處理器數量,這個值是由 Runtime.getRuntime().availableProcessors()得到的
*/
//獲取計算機處理器數量
int i = Runtime.getRuntime().availableProcessors();
System.out.println("該計算機處理器: " + i + "核");
5050
5050
改計算機處理器: 4核