欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识

但是既然线程构成了很多 劳务派遣系统其他的并发和并行编程的基础

点击: 次  来源:劳务派遣管理系统 时间:2017-11-16

原文出处: 并发编程网

译序

Doug Lea 大神关于Java 7引入的他写的Fork/Join框架的论文。

响应式编程(Reactive Programming / RP)作为一种范式在整个业界正在慢慢受到承认和落地,是对过往系统的业务需求领略梳理之后对系统技能设计/架构模式的晋升总结。Java作为一个成熟平台,对付趋势一向有些稳健的采取和跟进本领,有着令人赞叹的生命活力:

Java 7提供了ForkJoinPool,支持了Java 8提供的Stream(Reactive Stream是RP的一个焦点组件)。
别的Java 8还提供了Lamda(有效地表达和利用RP需要FP的语言构件和理念)。
有了前面的这些稳健但不失机缘的筹备,在Java 9中提供了面向RP的Flow API,为Java圈子提供了官方的RP API,符号着RP由集市式的自由摸索阶段 向 教堂式的统一利用的转变。

通过上面这些说明,可以看到ForkJoinPool的基本重要性。

对了,别的提一下Java 9的Flow API的@author也是 Doug Lee 哦~

PS:基于Alex/萧欢 翻译、方腾飞 校对的译文稿:Java Fork Join 框架,补译『结论』之后3节,调解了名目和一些用词,整理成完整的译文。译文源码在GitHub的这个客栈中,可以提交Issue/Fork后提交接码来发起/指正。

0. 摘要

这篇论文描写了Fork/Join框架的设计、实现以及机能,这个框架通过(递归的)把问题分别为子任务,然后并行的执行这些子任务,等所有的子任务都竣事的时候,再归并最终功效的这种方法来支持并行计较编程。总体的设计参考了为Cilk设计的work-stealing框架。就设计层面来说主要是环绕如何高效的去构建和打点任务行列以及事情线程来展开的。机能测试的数据显示精采的并行计较措施将会晋升大部门应用,同时也体现了一些潜在的可以晋升的空间。

校注1: Cilk是英特尔Cilk语言。英特尔C++编辑器的新成果Cilk语言扩展技能,为C/C++语言增加了细粒度任务支持,使其为新的和现有的软件增加并行性来充实掘客多处理惩罚器本领变得越发容易。

1. 简介

Fork/Join并行方法是获取精采的并行计较机能的一种最简朴同时也是最有效的设计技能。Fork/Join并行算法是我们所熟悉的分治算法的并行版本,典范的用法如下:

Result solve(Problem problem) {

    if (problem is small) {

        directly solve problem

    } else {

        split problem into independent parts
        fork new subtasks to solve each part
        join all subtasks
        compose result from subresults
    }
}

fork操纵将会启动一个新的并行Fork/Join子任务。join操纵会一直期待直到所有的子任务都竣事。Fork/Join算法,如同其他分治算法一样,老是会递归的、重复的分别子任务,直到这些子任务可以用足够简朴的、短小的顺序要领来执行。

一些相关的编程技能和实例在《Java并发编程 —— 设计原则与模式 第二版》[7] 4.4章节中已经接头过。这篇论文将接头FJTask的设计(第2节)、实现(第3节)以及机能(第4节),它是一个支持并行编程方法的Java™框架。FJTask 作为util.concurrent软件包的一部门,今朝可以在 http://gee.cs.oswego.edu/ 获取到。

2. 设计

Fork/Join措施可以在任何支持以下特性的框架之上运行:框架可以或许让构建的子任务并行执行,而且拥有一种期待子任务运行竣事的机制。然而,java.lang.Thread类(同时也包罗POSIX pthread,这些也是Java线程所基于的基本)对Fork/Join措施来说并不是最优的选择:

Fork/Join任务对同步和打点有简朴的和通例的需求。相对付通例的线程来说,Fork/Join任务所展示的计较机关将会带来越发机动的调治计策。譬喻,Fork/Join任务除了期待子任务外,其他环境下是不需要阻塞的。因此传统的用于跟踪记录阻塞线程的价钱在这种环境下实际上是一种挥霍。
对付一个公道的基本任务粒度来说,构建和打点一个线程的价钱甚至可以比任务执行自己所耗费的价钱更大。尽量粒度是应该跟着应用措施在差异特定平台上运行而做出相应调解的。可是高出线程开销的极度粗粒度会限制并行的发挥。
简而言之,Java尺度的线程框架对Fork/Join措施而言太粗笨了。可是既然线程组成了许多其他的并发和并行编程的基本,完全消除这种价钱可能为了这种方法而调解线程调治是不行能(可能说不切实际的)。

尽量这种思想已经存在了很长时间了,可是第一个宣布的能系统办理这些问题的框架是Cilk[5]。Cilk和其他轻量级的框架是基于操纵系统的根基的线程和历程机制来支持非凡用途的Fork/Join措施。这种计策同样合用于Java,尽量Java线程是基于初级此外操纵系统的本领来实现的。缔造这样一个轻量级的执行框架的主要优势是可以或许让Fork/Join措施以一种更直观的方法编写,进而可以或许在各类支持JVM的系统上运行。

可是既然线程组成了许多 劳务调派系统其他的并发和并行编程的基本