java设置并行度_控制Java并行流的并行度
java設(shè)置并行度
在掌握了這些新功能之后,隨著Java 9的最新發(fā)布,我們有了許多新功能可以用來改進(jìn)我們的解決方案。 Java 9的發(fā)布也是修改我們是否掌握J(rèn)ava 8功能的好時(shí)機(jī)。
在這篇文章中,我想解決關(guān)于Java并行流的最常見的誤解。 人們通常說您不能以編程方式控制并行流的并行度,并行流始終在共享的ForkJoinPool.commonPool()上運(yùn)行,您對此無能為力。 如果僅通過將parallel()調(diào)用添加到調(diào)用鏈來使流并行,就屬于這種情況。 在某些情況下,這可能就足夠了,例如,如果您僅對該流執(zhí)行輕量級(jí)操作,但是,如果您需要對流的并行執(zhí)行獲得更多控制,則您需要做的不僅僅是調(diào)用parallel()。
讓我們直接跳入自記錄示例,而不是深入研究理論和技術(shù)。
在共享的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的并行性級(jí)別感興趣,盡管如果需要,我們也可以控制ThreadFactory和UncaughtExceptionHandler。
ForkJoinPool調(diào)度程序?qū)⒃诤笈_(tái)進(jìn)行所有工作,包括合并工作竊取算法以提高并行處理效率。 值得一提的是,在某些情況下,例如,如果工作負(fù)載均勻地分布在工作線程上,使用ThreadPoolExecutor進(jìn)行手動(dòng)處理可能會(huì)更高效。
翻譯自: https://www.javacodegeeks.com/2017/11/controlling-parallelism-level-java-parallel-streams.html
java設(shè)置并行度
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的java设置并行度_控制Java并行流的并行度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java8默认内存收集器_使用正确的垃圾
- 下一篇: 写java代码时的注意事项_从方法返回J