控制Java并行流的并行度
在掌握了這些新功能之后,隨著Java 9的最新發布,我們有了許多新功能可以用來改進我們的解決方案。 Java 9的發布也是修改我們是否掌握Java 8功能的好時機。
在本文中,我想解決關于Java并行流的最常見的誤解。 人們通常說您不能以編程方式控制并行流的并行度,并行流始終在共享的ForkJoinPool.commonPool()上運行,您對此無能為力。 如果僅通過將parallel()調用添加到調用鏈來使流并行,就屬于這種情況。 在某些情況下,這可能就足夠了,例如,如果您僅對該流執行輕量級操作,但是,如果您需要對流的并行執行獲得更多控制,則您需要做的不僅僅是調用parallel()。
讓我們直接跳入自記錄示例,而不是深入研究理論和技術。
在共享的ForkJoinPool.commonPool()上處理并行流:
Set<FormattedMessage> formatMessages(Set<RawMessage> messages) {return messages.stream().parallel().map(MessageFormatter::format).collect(toSet()); }讓我們將并行處理移到我們可以控制且不必共享的池中:
private static final int PARALLELISM_LEVEL = 8;Set<FormattedMessage> formatMessages(Set<RawMessage> messages) {ForkJoinPool forkJoinPool = new ForkJoinPool(PARALLELISM_LEVEL);try {return forkJoinPool.submit(() -> formatMessagesInParallel(messages)).get();} catch (InterruptedException | ExecutionException e) {// handle exceptions} finally {forkJoinPool.shutdown();} }private Set<FormattedMessage> formatMessagesInParallel(Set<RawMessage> messages) {return messages.stream().parallel().map(MessageFormatter::format).collect(toSet()); }在此示例中,我們僅對ForkJoinPool的并行性級別感興趣,盡管我們也可以根據需要控制ThreadFactory和UncaughtExceptionHandler。
ForkJoinPool調度程序將在后臺進行所有工作,包括合并工作竊取算法以提高并行處理效率。 值得一提的是,在某些情況下,例如,如果工作負載均勻地分布在工作線程上,使用ThreadPoolExecutor進行手動處理可能會更高效。
翻譯自: https://www.javacodegeeks.com/2017/11/controlling-parallelism-level-java-parallel-streams.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的控制Java并行流的并行度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么用蓝牙控制电脑(如何用蓝牙控制电脑)
- 下一篇: ue注释快捷键(ue批量注释)