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设置并行度

java设置并行度_控制Java并行流的并行度相关推荐

  1. 控制Java并行流的并行度

    在掌握了这些新功能之后,随着Java 9的最新发布,我们有了许多新功能可以用来改进我们的解决方案. Java 9的发布也是修改我们是否掌握Java 8功能的好时机. 在本文中,我想解决关于Java并行 ...

  2. Java 8 - 正确高效的使用并行流

    文章目录 Pre 正确使用并行流,避免共享可变状态 高效使用并行流 流的数据源和可分解性 Pre Java 8 - 并行流计算入门 正确使用并行流,避免共享可变状态 错用并行流而产生错误的首要原因,就 ...

  3. java 登录失效时间_详谈Java设置session超时(失效)的时间

    详谈Java设置session超时(失效)的时间 免费学习推荐:java基础教程 在一般系统登录后,都会设置一个当前session失效的时间,以确保在用户长时间不与服务器交互,自动退出登录,销毁ses ...

  4. java核心教程_核心Java教程

    java核心教程 Welcome to Core Java Tutorial. I have written a lot on Core Java and Java EE frameworks. Th ...

  5. java web构建_使用Java构建一个宁静的Web服务

    java web构建 介绍 (Introduction) Due to its exponential growth, REST(Representational State Transfer) ha ...

  6. java 包命名_【Java】包的命名规则

    命名规范 包:所有单词的字母小写,之后每个单词用-隔开,如 org.nemo.demo 常量:所有单词的字母大写,之后每个单词用_隔开,如 FLAG 类:所有单词的首字母大写,如 TestJava p ...

  7. java 分割一个_分割java

    [java]分割字符串工具类,霸气 jdk自带的 java 分割字符串,分割string,可以根据多个条件去分割.比如逗号,分号,逗号或者分号. 比如一个字符串:"abc,def;gh,ij ...

  8. java武功秘籍_请问java全套内容都有什么呢?

    我整理的Java全套内容学习路线,分为6个阶段(大阶段)第一阶段:java内功心法篇 第二阶段:Java武功秘籍(经典框架) 第三阶段:Java高级功法(主流框架) 第四阶段:Java成神之路 第五阶 ...

  9. java se翻译_(翻译)Java SE 8 Lambda 标准库概览(下)

    Java SE 8 Lambda 标准库概览 8,Collectors 在目前的例子中,我们已经使用了collect()方法来收集流中的元素并放入List或Set中了.collec()方法的参数是一个 ...

最新文章

  1. Halcon算子--图像、区域、轮廓、测量、拟合、垂足、夹角
  2. 01.C++(一)----面向对象的思想
  3. Bootstrap list-group-item获取值
  4. SDUT 3377 数据结构实验之查找五:平方之哈希表
  5. linux mysql安装_Linux下安装mysql服务(超详细)
  6. 使用新的 apt 命令在 Ubuntu 16.04 LTS 下管理软件包
  7. 工单发料,退料等一些物料的移动
  8. Java学习(11-15天, 线性数据结构)
  9. 【运动学】基于matlab模拟布朗运动(可输入温度)【含Matlab源码 1610期】
  10. java出租车源码_基于WEB的JAVA出租车打车系统
  11. 3D编辑器-Web在线编辑基于WebGL/Threejs技术
  12. c语言float m1 m2什么意思,M0、M1、M2的涵义及其作用
  13. 《非线性成长》阅读笔记
  14. 用计算机打爸爸妈妈,看图写话打电脑
  15. java guardedby_java并发编程之Guarded Suspention
  16. mongodb导入数据
  17. strcpy和strncpy用法和区别
  18. 数据结构相关重点(个人总结)
  19. kubernetes cordon原理
  20. 怎么用计算机实现复数开平方,用你手中的计算器进行复数运算

热门文章

  1. [POJ 3164]Command Network(最小树形图,朱刘算法)
  2. P3309-[SDOI2014]向量集【线段树,凸壳】
  3. P3345-[ZJOI2015]幻想乡战略游戏【点分树,RMQ】
  4. P4047-[JSOI2010]部落划分【最小生成树】
  5. nssl1176-轨道【数论,Dp】
  6. P1496 vijos1165-火烧赤壁【离散化】
  7. P3224 [HNOI2012]永无乡(并查集+权值线段树合并/平衡树)
  8. 手机(jzoj 1983)
  9. 永远不要在 MySQL 中使用 UTF-8
  10. org.apache.ibatis.builder.BuilderException: Could not find value method on SQL annotation