[轉]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.pswp.cn/news/397087.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397087.shtml
英文地址,請注明出處:http://en.pswp.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.…