写点什么

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:063709
用户头像

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

关注

评论

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

【年度高价值技术团队】ProtonBase 荣登 InfoQ 2024 中国技术力量年度榜单!

ProtonBase

#云原生 #人工智能 #大数据 protonbase datawarebase

面向不同岗位的开发人员,平台工程都具备哪些能力?

行云创新

开发者 云原生 架构师 平台工程

天润融通助力连锁商超,客户感知驱动爆款单品打造

天润融通

这本秘籍送到心趴上了

CodeBuddy

阿里裁员就靠这166页精品Java面试手册成功逆袭java高级开发岗了

程序员高级码农

Java 编程 程序员 java面试 Java面试题

用豆包MarsCode IDE,从0到1画出精美数据大屏!

TRAE.ai

JavaScript AI AI编程 豆包MarsCode

《面试八股文》之2024年GitHub中文社区Java 领域又一份牛逼笔记

Summer

Java 程序员 面试 架构师 大厂

详解GaussDB(DWS)逻辑集群,如何化解大规模业务数据管理难题

华为云开发者联盟

数据库 数据仓库 GaussDB 逻辑集群

深度探索京东API接口:如何高效获取SKU详细信息与商品详情,附带实战代码示例

代码忍者

京东API接口

阿里巴巴1688 API接口详解:轻松获取商品详情与店铺所有商品信息

代码忍者

1688API接口 关键词搜索1688API

金三银四 Java 面试八股文高频题精选 700 道(附答案整理)

Summer

Java 程序员 面试 架构师 大厂

流存储Fluss:迈向湖流一体架构

Apache Flink

大数据 flink 实时计算 实时数据分析 Fluss

独家丨原阿里达摩院、「木蚁机器人」CTO张硕切入具身智能赛道,做机器人大脑

机器人头条

大模型 人形机器人 具身智能 阿里达摩院

什么是二级域名?一级域名和二级域名有什么区别?

国科云

码上报名 | 东方通联合openEuler社区即将开启云原生开源中间件 Meetup北京站

科技热闻

华为应用市场召开首届“编辑之选创享会”,推动原生鸿蒙应用生态持续创新

最新动态

淘宝天猫API接口深度解析:如何高效利用商品详情与关键词搜索商品列表功能

代码忍者

淘宝API接口

站外商详的重构与优化|得物技术

得物技术

前端 H5

天润融通客服系统升级,智能托管让员工效率飞跃

天润融通

天润融通走进蚂蚁集团|AI助力客户经营,打开企业增效密码

天润融通

2024全球人形机器人领域深度洞察和前瞻报告:具身智能技术、人形机器人、大模型、商业化卡点和趋势分析

机器人头条

大模型 人形机器人 具身智能

以技术赋能艺术,华为视频AiMax品鉴会助力国乐在创新中焕发新生

最新动态

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