写点什么

Java 7 的并行支持:Fork/Join

  • 2008-03-23
  • 本文字数:1520 字

    阅读完需:约 5 分钟

今天,处理器的内核数量在不断增加,以什么样的方法开发程序才能发挥出新硬件的效能呢?这正变成一个愈发重要的问题摆在了开发者面前。 IBM Developerworks 已经发布了一篇介绍 Fork-Join 并发类库的连载文章,Fork-Join 类库会作为即将来到的 Java 7 的一部分进行发布。InfoQ 以前也报道过 Java 7 中最初的 fork/join 提案,其中还包含来自最初创建者 Doug Lea 的反馈。 Doug Lea 在他的论文“ Fork/Join Parallelism in Java ”中,首次把 fork/join 的概念引入到 Java 中。Doug Lea 的 util.concurrent 包是 JSR-166 的基础,后者是发布在 Java 5 中的 java.util.concurrentl 类库。Fork/Join 是对 JSR-166 的简单修订。

连载文章的第一部分详细介绍了 fork-join 类库的核心概念,以及它要解决的问题:

硬件的发展趋势非常清晰;Moore 定律表明不会出现更高的时钟频率,但是每个芯片上会集成更多的内核。很容易想象让十几个处理器繁忙地处理一个粗粒度的任务边界(比如一个用户请求),但是这项技术不会扩大到数千个处理器——在这种环境下短时间内流量可能会呈指数级增长,但最终硬件趋势将会占上风。当跨入多内核时代时,我们需要找到更细粒度的并行性,否则将面临即便有许多工作需要去做而处理器却仍处于空闲的风险。如果希望跟上技术发展的脚步,软件平台也必须配合主流硬件平台的转变。最终,Java 7 将会包含一种框架,用于表示某种更细粒度级别的并行算法:fork-join 框架

第二部分深入探讨了在第一部分里定义的概念,涉及到分而治之(divide-and-conquer)的编程技术: > Fork-join 融合了分而治之技术;获取问题后,递归地将它分成多个子问题,直到每个子问题都足够小,以至于可以高效地串行地解决它们。递归的过程将会把问题分成两个或者多个子问题,然后把这些问题放入队列中等待处理( fork步骤),接下来等待所有子问题的结果(join步骤),把多个结果合并到一起。

文章接下来展示了一个使用 fork/join 实现合并排序(merge-sort)算法的示例。

这个连载系列的最后一部分介绍了ParallelArray 类。ParallelArray 是一个可用于fork/join 算法的数据结构,它提供了一个通用目的API,以高度并发的方式执行数据集的搜索、过滤和转换。

从事 Java 的 BGGA 闭包提案的团队已经采纳了 fork-join 框架与闭包协同工作。他们还在站点上提供了一个可以工作的实现。Developerworks 上的那篇连载文章列举了两个使用ParallelArray 类的例子,它们之间的区别在于是否使用了闭包:

下面的例子是查找一组学生中最好的GPA,它用到了当前Java 7 的fork/join 提案:

ParallelArray students = new ParallelArray(fjPool, data);<br></br>double bestGpa = students.withFilter(isSenior)<br></br> .withMapping(selectGpa)<br></br> .max();<p>public class Student {</p><br></br> String name;<br></br> int graduationYear;<br></br> double gpa;<br></br>}<p>static final Ops.Predicate isSenior = new Ops.Predicate() {</p><br></br> public boolean op(Student s) {<br></br> return s.graduationYear == Student.THIS_YEAR;<br></br> }<br></br>};<p>static final Ops.ObjectToDouble selectGpa = new Ops.ObjectToDouble() {</p><br></br> public double op(Student student) {<br></br> return student.gpa;<br></br> }<br></br>};<br></br> 下面的例子与上面的相同,不过使用了 BGGA 闭包提案:
double bestGpa = students.withFilter({Student s => (s.graduationYear == THIS_YEAR) })<br></br> .withMapping({ Student s => s.gpa })<br></br> .max();<br></br> 根据当前的状况估计,Java 7 会在 2009 年早期发布。查看英文链接: Parallelism with Fork/Join in Java 7

2008-03-23 22:063409
用户头像

发布了 53 篇内容, 共 13.9 次阅读, 收获喜欢 2 次。

关注

评论

发布
暂无评论
发现更多内容

压缩解压工具:Keka中文版

真大的脸盆

Mac Mac 软件 压缩工具 解压缩软件 解压软件

零代码零距离,明道云开放日北京站圆满结束

明道云

软件测试/测试开发丨app自动化测试之Andriod WebView如何测试

测试人

软件测试 自动化测试 测试开发

面试官:如何保证接口幂等性?一口气说了9种方法!

程序员大彬

Java 接口幂等

设计模式之美––依赖反转

GalaxyCreater

设计模式

机器学习算法(六)基于天气数据集的XGBoost分类预测

汀丶人工智能

数据挖掘 数据分析 XGBoost

机器学习算法(五):基于企鹅数据集的决策树分类预测

汀丶人工智能

数据挖掘 机器学习 决策树

【Redis源码分析】Server启动过程

零点999

redis Redis 协议 Redis 核心技术与实战 Redis 数据结构 redis 底层原理

隐式等待、显示等待和强制等待

测吧(北京)科技有限公司

测试

狼来了

俞凡

人工智能

电商秒杀系统

Geek_7d539e

SaaS 软件搞定客户的关键环节分析

产品海豚湾

产品经理 SaaS 产品运营 B 端产品 互联网产品

架构蓝图--软件架构的“4+1”视图模型

涛哥 数字产品和业务架构

软件架构 模型

pdf编辑工具:PDF Expert 中文激活版

真大的脸盆

Mac PDF Mac 软件 PDF编辑 pdf编辑工具

【JVM盲点补漏系列】「并发编程的难题和挑战」深入理解JMM及JVM内存模型知识体系机制(1)

洛神灬殇

Java JVM 3月月更

关于chatGPT是否会干掉程序员的一次专业评估

深清秋

ChatGPT 程序员发展

Spring中PropertyPlaceholderConfigurer替换占位符的问题

石臻臻的杂货铺

spring-boot

华为云ECS/HECS:中小企业上云第一步

IT科技苏辞

QQ截图图片不够清晰解决方法

源字节1号

微信小程序 开源 软件开发

Gestures(手势)

芯动大师

Activity 手势 gesturelistener

前缀和算法练习集

timerring

前缀和

照片肖像美容软件:ON1 Portrait AI 2023.1 激活版

真大的脸盆

Mac Mac 软件 照片处理工具 肖像美容软件

Kotlin 学习笔记(二)—— 数据类、密闭类、循环写法以及常用集合操作符

修之竹

android kotlin

如何编写测试用例?

测吧(北京)科技有限公司

测试

软件测试/测试开发丨app自动化之如何参数化用例

测试人

软件测试 自动化测试 测试开发

别急着给中国版ChatGPT唱赞歌:“追风者”无缘“星辰大海”

Alter

百度 大模型 ChatGPT 文心一言

华为P系列,雪夜梅花开,似是故人来

脑极体

华为

为什么大家都喜欢“人天”作为估算单位?

Bruce Talk

Scrum 敏捷开发 Agile

往往排查很久的问题,最后发现都非常简单。。。

艾小仙

Java kafka spring

解决 Font '宋体' is not available to the JVM

源字节1号

微信小程序 开源 软件开发

adb的常用命令

测吧(北京)科技有限公司

测试

Java 7的并行支持:Fork/Join_Java_R.J. Lorimer_InfoQ精选文章