写点什么

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

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

关注

评论

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

长安链源码分析启动(4)

长安链

1. 操作系统—概述

小呆鸟

操作系统 8月月更

Prometheus 实战 (1):容器安装

Grafana 爱好者

Prometheus

后疫情时代,传统制造业如何打破生产协同瓶颈?

IT资讯搬运工

开源一夏 | 一场由serialVersionUID 引发的线上问题

六月的雨在InfoQ

开源 serialVersionUID transient Serializable接口 8月月更

阿里云金融创新峰会云原生分论坛圆满举办,加速金融行业落地云原生

阿里巴巴云原生

阿里云 云原生 金融行业

基于龙蜥操作系统指令加速,降低云原生网关的构建成本

阿里巴巴云原生

阿里云 云原生 云原生网关 龙蜥

Spring源码分析(二)Spring怎么扩展解析xml接口的

石臻臻的杂货铺

spring 源码 8月月更

前端高频面试题(附答案)

helloworld1024fd

JavaScript 前端

99 大促来袭,利用 MSE 服务自治体系为业务保驾护航

阿里巴巴云原生

阿里云 微服务 云原生

SQL改写系列九:外连接转内连接的常见场景与错误-2

OceanBase 数据库

K-进制数(简洁 图解)

Five

算法题 8月月更

数据、算力强支撑,佳格天地联合华为云打造农业农村大数据解决方案

IT资讯搬运工

2022年Q2银行APP活跃用户规模盘点:头部银行增长稳定

易观分析

金融 银行 用户规模

3. 操作系统—物理内存管理

小呆鸟

操作系统 操作 8月月更

测试需求平台2-搭建前后端分离github托管项目

MegaQi

测试平台开发 9月月更

长安链源码分析启动(3)

长安链

C/C++普通函数与函数模板的区别,调用规则,模板局限性

CtrlX

c c++ C# 8月月更

低代码是什么意思?低代码平台的技术特点是什么?

优秀

低代码

9月17日 杭州站 | Serverless Developer Meetup 开启报名

阿里巴巴云原生

阿里云 Serverless 云原生

Sring源码解析(一)Spring是怎么读取配置Xml文件的

石臻臻的杂货铺

spring 源码 8月月更

[JS入门到进阶] 手写解析URL参数的工具,并部署。用起来又快又爽!

HullQin

CSS JavaScript html 前端 8月月更

区块链商用案例:网间结算联盟链建设实战

鲸品堂

区块链 运营商 企业号九月金秋榜

YonBuilder移动开发 AVM框架 封装车牌号输入键盘组件

YonBuilder低代码开发平台

程序员 App 移动开发 多端开发

低代码适用于哪些应用开发场景

力软低代码开发平台

聚四方之力,合四方之需:智能云网的持续进化

脑极体

隗华:OceanBase 企业服务助力客户实现业务无忧

OceanBase 数据库

2. 操作系统—中断、异常、系统调用

小呆鸟

操作系统 操作 8月月更

长安链源码分析启动(5)

长安链

APICloud AVM 封装验证码输入框组件

YonBuilder低代码开发平台

程序员 前端开发 低代码开发 多端开发

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