2 回答

TA貢獻1816條經(jīng)驗 獲得超6個贊
這些是您必須滿足的條件,以便您可以執(zhí)行并發(fā)縮減,如關(guān)于并行的Java 文檔中所述:
如果對于包含收集操作的特定管道滿足以下所有條件,則 Java 運行時會執(zhí)行并發(fā)減少:
流是并行的。
收集操作的參數(shù)收集器具有特征 Collector.Characteristics.CONCURRENT。要確定收集器的特征,請調(diào)用 Collector.characteristics 方法。
流是無序的,或者收集器具有特征 Collector.Characteristics.UNORDERED。要確保流是無序的,請調(diào)用 BaseStream.unordered 操作。
但是,正如@Jigar Joshi 所提到的,它是否會加快您的地圖構(gòu)建將取決于其他方面,包括(但不僅限于):
您必須處理多少個元素
您的應(yīng)用程序已經(jīng)使用了多少線程
有時使用并行性(創(chuàng)建和停止線程,使它們通信和同步,...)的開銷大于收益。

TA貢獻1712條經(jīng)驗 獲得超3個贊
如果您只是想知道如何更好地利用并行性,您可以執(zhí)行以下操作:
ConcurrentMap<Integer, List<Integer>> map = IntStream.range(0, Integer.MAX_VALUE)
.parallel()
.filter(i -> i % 2 == 0)
.boxed()
.collect(Collectors.groupingByConcurrent(
i -> i / 3,
Collectors.mapping(i -> i, Collectors.toList())));
Pairs 的中間創(chuàng)建是不必要的,groupingByConcurrent并行累積到新的 ConcurrentMap 中。
請記住,使用并行流時,您會遇到常見的ForkJoinPool. 對于并行化,最好使用更靈活的東西,例如 anExecutorService而不是 Java Streams。
添加回答
舉報