[转]Java7中的ForkJoin并发框架初探(上)——需求背景和设计原理

详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp83

这篇我们来简要了解一下JavaSE7中提供的一个新特性 —— Fork Join 框架

0. 处理器发展和需求背景

回想一下并发开发的初衷,其实可以说是有两点,或者说可以从两个方面看。

  • 对于单核的处理器来说,在进行IO操作等比较费时的操作进行时,如果执行任务的方式是单任务的,那么CPU将会“空转”,知道IO操作结束。如果有多任务的调度机制,则在一个任务不需要CPU支持的时候,CPU可以被调度处理其他任务。简单地讲,并发可以提高CPU计算资源的利用率。
  • 对于多核,或者多个计算资源的情况下,并发可以在某种程度上达到“并行”,即同时运行,缩短了任务完成的时间,提高了任务完成的效率。

我们再来看一下处理器计算能力的发展(讲并发或者并行基本都要提到),Intel的创始人之一Gordon Moore曾经说过一句话,大概意思是:

当价格不变时,集成电路上可容纳的晶体管数目,约每隔18个月便会增加一倍,性能也将提升一倍。

我们可以这样理解,处理器的计算能力在一定意义上和芯片上集成的晶体管数量有关,而这项继承技术的发展史飞快的。但是,什么事情都是有一个极限的,提升计算性能仅仅靠增加晶体管数量提高处理器主频是不现实的,于是多核处理器的概念就出来了。

随着在硬件上多核处理器的发展和广泛使用,软件开发上的变革也在进行。简单来想,对于多个不相关的小任务来讲,可以分派到不同的处理器核心来进行处理。然而,对于一个比较大的任务,如何能够充分利用多核计算资源就是一个值得考虑的问题。

解决这个问题的办法就是“分而治之”,而Fork Join正式这样一种思路的产物。

1. Fork Join 的设计简介

看过《Introduction to Algorithms》(《算法导论》)的朋友们应该还记得,在讲到归并排序(Merge Sort)和快速排序的时候,有一种很简单又很有效率的思路就是“分而治之”,即“分治法”。而Fork Join的思路也是同理,只不过划分之后的任务更适合分派给不同的计算资源,可以并行的完成任务。

ForkJoin的任务分解和合并

ForkJoin的任务分解和合并

当计算分别完成之后,最后再合并回来。

简单来看,就是一个递归的分解和合并,知道任务小到可以接受的程度。

2. Fork Join 设计要点

Fork Join设计出来就是为了提高任务完成的效率,围绕这个目标,有一些要点是设计中需要考虑的,下面就给出一些要点。

  • 线程的管理和线程的单纯性。基于如上的设计思路,我们可以看到子任务之间的相关性是相对比较简单的,可以并行处理。为了提高效率,并不需要重量级的线程结构和对应的线程维护,线程实现简单就好,满足需求即可,降低维护成本。
  • 队列机制,硬件支持一定是比较有限的,那么分解的任务应该用队列维护起来,一个好的队列设计是很有必要的。
  • “工作窃取”,也就是设计论文原文中提到的 Work Stealing 。对于负载比较轻的线程,可以帮助负载较重的执行线程分担任务。

对于使用Fork Join的开发者来讲,需要注意:

  • 可用线程数和硬件支持。线程这东西,也是有开销的东西,绝对不是越多越好,尤其在硬件基础有限的情况下。
  • 任务分解的粒度。和前者有关系,就是分解的任务,“小”到什么程度是可以接受的,不可再分。

3. Fork Join数据结构支持

按照如上设计,分解执行一个大的任务,Fork Join至少需要考虑如下一些数据结构。

  • 轻量级的线程结构。
  • 维护线程的线程池,负责线程的创建,数量维护和任务管理。
  • 维护任务,并支持Work Stealing的双端队列。如下图。
ForkJoin队列

支持ForkJoin任务维护的双端队列Deque

对于子任务的分解,可以从后端取出分解再放入,而对于WorkStealing则可以从头部取出,放入其他队列的尾部。

到此,本文仅仅是对Fork Join的大致设计思路做一个描述、勾勒。下一篇文章中会对JDK1.7中给出的实现作出分析。

转载于:https://www.cnblogs.com/grefr/p/5046286.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397087.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装oculus运行时出现问题_U盘安装windows10出现的问题解决方法

安装windows10 出现的问题之前安装windows10都没什么问题,今天安装windows10出现了好多问题,记录一下。我这个教程我觉得是最好的安装教程安装windows10教程问题1. 我们无法创建新的分区,找不到现有分区(或者因为MBR分区表问题&am…

JavaFx导出文件

导出文件格式可选 protected void handExportDateAction(ActionEvent event) {// ShowDialog.showConfirmDialog(FXRobotHelper.getStages().get(0),// "是否导出数据到txt?", "信息");FileChooser fileChooser new FileChooser();FileChooser…

python选择排序从大到小_Python实现选择排序

一、选择排序简介选择排序(Selection sort)是一种简单直观的排序算法。选择排序首先从待排序列表中找到最小(大)的元素,存放到元素列表的起始位置(与起始位置进行交换),作为已排序序列,第一轮排序完成。然后,继续从未排序序列中找…

【Ubuntu14】Nginx+PHP5+Mysql记录

这次因为工作原因,需要在Linux下进行开发。推荐的环境是Ubuntu14NginxPHPMysql。环境搭建好之后,装上GIT,装上IDE,觉得Mysql命令界面麻烦又装了个Navicat。总体用下来感觉很带感。 【虚拟机与镜像文件】 这里我采用的虚拟机是VMwa…

java句柄数过高怎么解决_主播个人及企业利润高,个税或企业所得税怎么解决...

网络直播在2020年尤为火热,男女老少都纷纷投入其中,究其原因还是其行业表现出来的“利润高”等。也确实有部分人取得了一定的成效,也催生了不少的直播平台、经纪公司的出现。 那么这些主播个人或者企业利润高,个税或企业所得…

杂项-Java:JBoss

ylbtech-杂项-Java:JBoss是一个基于J2EE的开放源代码的应用服务器。 JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用。JBoss是一个管理EJB的容器和服务器,支持EJB 1.1、EJB 2.0和EJB3的规范。但JBoss核心服务不包括支持servlet/JSP的WE…

任务调度及远端管理(基于Quartz.net)

这篇文章我们来了解一些项目中的一个很重要的功能:任务调度 可能有些同学还不了解这个,其实简单点说任务调度与数据库中的Job是很相似的东西 只不过是运行的物理位置与管理方式有点不一样,从功能上来说我觉得还是差不多的, 存储过…

2015/12/15--Document对象

<html> <head> <script type "text/javascript"> //使用document.write()输出流写文本 document.write("hello,world!"); //使用document.write()输出流写HTML document.write("<h1>welcome to my world!</h1>")…

C# 子类实例化基类 基类使用不了子类的方法_C#高级编程面试考题

一、简答题1.简述C#中的所有访问修饰符及访问权限private(私有的)给类&#xff0c;及所有类成员使用所有类成员的默认访问修饰符可访问范围当前类自身public(公开的)给类&#xff0c;及所有类成员使用可访问范围当前类自身所有的子类同一程序集其他类通过实例化也可以访问其他程…

协程(Coroutine)与多线程,多进程

执行多个任务可以使用多线程或多进程。 多进程中&#xff0c;同一个变量&#xff0c;各自有一份拷贝存在于每个进程中&#xff0c;互不影响 多线程中&#xff0c;所有变量都由所有线程共享。而线程间的切换是系统进行调度&#xff0c;无法控制&#xff0c;所以可能 一个进程中的…

关于img 403 forbidden的一些思考

网页中经常需要显示图片给用户看&#xff0c;对网站本身来说有的图片是从本地图片服务器来的&#xff0c;但是一旦数量多了以后&#xff0c;磁盘空间又是一个问题。 所以有时就希望显示其他网站的Image&#xff0c;直接把其他网站的图片显示在我的网站上。但并不是所有的外网Im…

Leetcode: Kth Largest Element in an Array

Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.For example, Given [3,2,1,5,6,4] and k 2, return 5.Note: You may assume k is always valid, 1 ≤ k ≤ arrays lengt…

python 循环赋值_Python打牢基础,从19个语法开始!

Python简单易学&#xff0c;但又博大精深。许多人号称精通Python&#xff0c;却不会写Pythonic的代码&#xff0c;对很多常用包的使用也并不熟悉。学海无涯&#xff0c;我们先来了解一些Python中最基本的内容。Python的特点解释型语言&#xff0c;无需编译即可运行提供了交互式…

uwp连接mysql数据库_在 UWP 应用中使用 SQLite 数据库

在 UWP 应用中使用 SQLite 数据库Use a SQLite database in a UWP app06/26/2020本文内容可以使用 SQLite 在用户设备上的轻量级数据库中存储和检索数据。You can use SQLite to store and retrieve data in a light-weight database on the users device. 本指南演示如何执行该…

12-事件委托(事件代理)

什么是事件委托 通俗的讲&#xff0c;事件就是onclick&#xff0c;onmouseover&#xff0c;onmouseout&#xff0c;等就是事件&#xff0c;委托呢&#xff0c;就是让别人来做&#xff0c;这个事件本来是加在某些元素上的&#xff0c;然而你却加到别人身上来做&#xff0c;完成这…

oracle 窗口函数 (keep)

看到很多人对于keep不理解&#xff0c;这里解释一下&#xff01;Returns the row ranked first using DENSE_RANK2种取值&#xff1a;DENSE_RANK FIRSTDENSE_RANK LAST在keep (DENSE_RANK first ORDER BY sl) 结果集中再取max、min的例子。SQL> select * from test;ID MC SL…

MySQL 的实时性能监控利器

操作系统及MySQL数据库的实时性能状态数据尤为重要&#xff0c;特别是在有性能抖动的时候&#xff0c;这些实时的性能数据可以快速帮助你定位系统或MySQL数据库的性能瓶颈&#xff0c;就像你在Linux系统上使用「top&#xff0c;sar&#xff0c;iostat」等命令工具一样&#xff…

设置linearlayout最大高度_技术案例 | 排烟口个数与挡烟垂壁高度的关系探讨

随着《建筑防烟排烟系统技术标准》( 以下简称新规范) 的正式实施&#xff0c;新规范对排烟系统的设计提出了完全不同的设计理念。根据新规范正文: 当建筑空间净高不大于6m时&#xff0c;每个防烟分区的排烟量应按不小于60m/(h㎡)计算且不小于15,000m/h( 走道不小于13,000m/h) &…

python安装requests第三方模块

2018-08-28 22:04:51 1 .下载到桌面后解压&#xff0c;放到python的目录下 --------------------------------------------------------------------------------------------------------------------------------------------------------- 2 . 在CMD输入以下 F:\>cd /d F…

mysql整站源码安装_MySQL入门01-MySQL源码安装

操作系统&#xff1a;CentOS 6.7MySQL版本&#xff1a;5.6.301.前期准备首先需要CMake&#xff0c;可以yum直接安装&#xff1a;yum install cmake也可以官网 https://cmake.org/ 下载源码编译。我这里选择了官网下载最新版本cmake-3.5.2.tar.gz。# tar -zxvf cmake-3.5.2.tar.…