Java 7:滿足Fork / Join框架

JSR-166(y)是Java 7中包含的此新功能的正式名稱。如果您發現名稱中有一個“ y”,這是因為自Java 5起就添加了JSR-166(并發實用程序) ,但它不會就此停止,因為已經有計劃在JSR-166(e)下在Java 8中添加新類。 檢查此頁面,由JSR-166的創建者Doug Lea維護,以獲取更多信息。

根據Wikipedia的說法, 并行性是“在多個處理器上同時執行已編程指令和數據的多個實例的某種組合”,并且Java從第1天起就有類和接口來實現此目的(有點……)。您可能將它們稱為: java .lang.Thread , java.lang.Runnable等…并發實用程序( java.util.concurrent包)的作用是簡化并發任務的編碼方式,因此我們的代碼更加簡單和簡潔。 作為開發人員,在具有更高處理資源的計算機上運行應用程序時,我們無需執行任何操作,顯然,我們的應用程序性能會提高,但是我們是否真的在最大限度地利用處理資源? 答案是否定的。

這篇文章將向您展示在處理可分為小問題的問題時,Fork / Join框架將如何最大程度地幫助我們使用處理資源,并且解決這些小問題中的每一個的所有解決方案都將產生大問題的解決方案問題(例如遞歸,分而治之)。

你需要什么

NetBeans 7+或任何其他支持Java 7 JDK 7+的 IDE
圖像模糊 ,來自Oracle的示例

基礎

Fork / Join框架專注于使用計算機中可用的所有處理資源來提高應用程序的性能。 它旨在簡化Divide and Conquer算法中的并行性。 Fork / Join框架背后的魔力在于其工作竊取算法,該算法中的工作線程可以從其他繁忙線程中自由竊取任務,因此所有線程始終都在工作。 以下是開始使用框架時應了解的基礎知識:

  • Fork意味著將任務分為子任務并進行處理。
  • 聯接意味著將每個子任務的解決方案合并為一個通用解決方案。
  • java.lang.Runtime使用此類來獲取可用于Java虛擬機的處理器數量。 為此,請使用方法+ availableProcessors():int
  • java.util.concurrent.ForkJoinPool框架的主類,是實現工作竊取算法并負責運行任務的類。
  • java.util.concurrent.ForkJoinTask抽象類,用于在java.util.concurrent.ForkJoinPool中運行的任務。 將任務理解為整個工作的一部分,例如,如果您需要在數組上做某事,則一個任務可以在位置0n / 2上工作,而另一個任務可以在位置(n / 2)+1上工作n-1 ,其中n是數組的長度。
    • java.util.concurrent.RecursiveAction抽象任務類的子類,在不需要任務返回結果時使用它,例如,當任務在數組的位置上工作時,它不返回任何內容,因為它在陣列上工作。 為了完成這項工作,您應該實現的方法是compute():void ,請注意void返回值。
    • java.util.concurrent.RecursiveTask抽象任務類的子類,當任務返回結果時使用它。 例如,在計算斐波那契數時,每個任務必須返回它計算出的數以加入它們并獲得一般解。 為了完成這項工作,您應該實現的方法是compute():V ,其中V是返回值的類型; 對于Fibonacci示例, V可以是java.lang.Integer。

使用框架時,應定義一個標志,該標志指示是否有必要派生/加入任務或是否應直接計算工作。 例如,在處理數組時,可以指定如果數組的長度大于500_000_000,則應分叉/加入任務,否則,數組足夠小以直接計算。 本質上,接下來應顯示的算法如下:

if(the job is small enough)
{compute directly
}
else
{split the work in two pieces (fork)invoke the pieces and join the results (join)
}

好了,現在理論太多了,我們來看一個例子。

這個例子

模糊圖像需要對圖像的每個像素進行處理。 如果圖像足夠大,我們將需要處理大量像素,因此我們可以使用fork / join對它們進行處理,并最大限度地利用處理資源。 您可以從Java?Tutorials站點下載源代碼。

下載源代碼后,打開NetBeans IDE 7.x并創建一個新項目:

然后從顯示的彈出窗口的Java類別中選擇“具有現有源代碼的Java項目”

選擇一個名稱和一個項目文件夾,然后單擊下一步>

現在, 在圖像示例中選擇下載了Blur源代碼的文件夾:

并選擇文件ForkBlur.java,然后單擊完成:

將導入源代碼,并創建一個新項目。 請注意,新項目顯示為錯誤,這是因為默認情況下未啟用Java 7:

要解決此問題,請右鍵單擊項目名稱,然后選擇選項屬性 。 在彈出對話框中,轉到“ 庫”,然后從“ Java平臺組合框”中選擇“ JDK 1.7 ”:

現在,轉到選項Sources并從Source / Binary Format ComboBox中選擇JDK 7

最后但并非最不重要的一點是,在運行此應用程序時增加分配給虛擬機的內存,因為我們將訪問500萬個位置數組(或更多)。 轉到選項運行并在VM Options TextBox上插入-Xms1024m -Xmx1024m

單擊確定 ,您的項目應該沒有錯誤進行編譯。 現在,我們需要找到足夠大的圖像,以便可以處理較大的陣列。 一段時間后,由于好奇心機器人的幫助,我發現了火星上的一些很棒的圖像(約150 MB),您可以從此處下載圖像 。 下載圖像后,將其粘貼到項目的文件夾中。

在運行示例之前,我們需要修改源代碼,以便控制何時使用Fork / Join框架運行它。 在ForkBlur.java文件中,轉到第104行,以更改將要使用的圖像的名稱:

//Change for the name of the image you pasted 
//on the project's folder.
String filename = 'red-tulips.jpg';

然后,用下面的代碼替換第130至136行:

ForkBlur fb = new ForkBlur(src, 0, src.length, dst);boolean computeDirectly = true;long startTime = System.currentTimeMillis();if (computeDirectly) {fb.computeDirectly();} else {ForkJoinPool pool = new ForkJoinPool();pool.invoke(fb);}long endTime = System.currentTimeMillis();

注意computeDirectly標志。 為true時 ,我們將使用fork / Join Framework,而是直接計算任務。 如果為false,將使用fork / join框架。

ForkBlur類中的compute():void方法實現了fork / join算法。 它基于數組的長度,當數組的長度大于10_000時,將分派任務,否則將直接計算任務。

在不使用Fork / Join框架( computeDirectly = true )的情況下, 在圖像示例上執行Blur時,您可以看到我的2個處理器,大約花了14 秒鐘完成工作:

您可以看到處理器正在工作,但沒有達到最大。 當使用Fork / Join框架( computeDirectly = false )時,您可以看到它們以100%的速度工作,并且花了將近50%的時間來完成工作:

該視頻顯示了完整的過程:

希望您能看到這個框架有多有用。 當然,您不能在代碼中全部使用它,但是只要您有一個可以分為多個小任務的任務,那么您就知道該呼叫誰。

參考: Java 7:在Java and ME博客上, 與 JCG合作伙伴 Alexis Lopez交流Fork / Join框架 。


翻譯自: https://www.javacodegeeks.com/2012/10/java-7-meet-forkjoin-framework.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370914.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370914.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370914.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

css3總結之居中

居中在前端布局上很常見,也很常用,也是最基本的技巧。居中效果在方向控制上基本可以分解成水平居中,垂直居中和水平垂直居中。 針對調整的元素不同,具體的處理方式上有些差異。這里我們先不講絕對定位下的居中,絕對定位…

PHP進程及進程間通信

一、引言 進程是一個具有獨立功能的程序關于某個數據集合的一次運行活動。換句話說就是,在系統調度多個cpu的時候,一個程序的基本單元。進程對于大多數的語言都不是一個陌生的概念,作為"世界上最好的語言PHP"當然也例外。 二、環境…

福州java培訓哪里好_南通java培訓哪家好

渡課IT教育成立于2006年,14年來,我們累計輸送學員達 6000 ,其中南通地區輸送50%,上海 40%,其他地區 10%,學員1年后的平均薪水達 9860 元;受到1000用人單位的贊譽與支持。Java開發的需求量在北上…

Linux 服務器注意事項

1.創建時 數據文件一定分盤掛載 2.LVM 虛擬磁盤卷是否創建 有爭議???3.hosts 文件 最好添加本機映射 主機名 127.0.0.1 4.iptables 開啟轉載于:https://www.cnblogs.com/centos2017/p/7896681.html

linux 查看下掛磁盤,linux下磁盤掛載與查看

df查看系統分區和使用情況使用方法:df-h(自動按照大小做單位適應顯示)df-i(查看iNode使用情況)free查看..LABELdefaults默認選項:rw (可讀寫)sudi (加此選項后則該分區可為文件加s權限;如不需要則寫為nosuid)dev(可以解析該分區下的塊…

研究僵局–第2部分

調查死鎖時最重要的要求之一就是要研究死鎖。 在我的上一個博客中,我編寫了一個名為DeadlockDemo代碼,該代碼使用一堆線程在一系列銀行帳戶之間轉移隨機數,然后陷入僵局。 該博客運行該代碼以演示獲取線程轉儲的幾種方法。 線程轉儲只是一個…

從0開始接觸html--第一天學習內容總結

第一天 總結: h1-h6 p 段落 hr br有序 ol li 無序 ul li 定義列表 dl dt dd塊級元素:獨占一行,h1-h6 p hr div行內元素:共占一行, em和i strong和b u del和s span塊級分區元素:div header nav article footer行內分區元素&#…

連鎖便利店管理系統有什么用

連鎖便利店管理系統對于連鎖便利店的運營和管理非常有用。以下是一些常見的用途: 1. 庫存管理:連鎖便利店通常需要管理多個門店的庫存,管理系統可以幫助實時掌握各個門店的庫存情況,包括商品數量、進貨記錄、庫存調撥等。這樣可以…

經常使用meta標簽屬性

《meta》 1.Keywords (keyword)說明&#xff1a;告訴搜索引擎你網頁的keyword是什么。 使用方法&#xff1a;<meta name"keywords" content"SEO優化,SEO優化教程,站點優化,搜索引擎優化教程"> 2. Description (網頁描寫敘述)說明&#xff1a;Descrip…

瀏覽器打印設置橫向打印_愛普生打印機無線連接設置

1、首先&#xff0c;把epsonl385打印機插上電源通電&#xff0c;待自檢完成后&#xff0c;便可以設置。如果用戶家里的無線路由器帶有WPS(Wi-Fi Protected Setup)或QSS(又稱快速安全設置)功能&#xff0c;那就簡單多了。2、通過WPS或QSS無線路由器按鈕連接&#xff0c;給無線路…

linux python定時任務調度,Python下定時任務框架APScheduler的使用

1.APScheduler簡介&#xff1a;APScheduler是Python的一個定時任務框架&#xff0c;可以很方便的滿足用戶定時執行或者周期執行任務的需求&#xff0c;它提供了基于日期date、固定時間間隔interval 、以及類似于Linux上的定時任務crontab類型的定時任務。并且該框架不僅可以添加…

圖片和文件上傳js剖析

/** * 商戶資質信息模塊js * * 涉及頁面組件 { * 上傳組件&#xff08;UploadFileComponent&#xff09; * } * * * 初始化工具&#xff08;init&#xff09; * * Author:Waver */var qualificationInfoModule (function() { // 上傳文件類型 var UPLOAD_FILE_TYPE…

研究僵局–第1部分

我敢肯定我們都去過那里&#xff1a;太晚了&#xff0c;您餓了&#xff0c;服務器已掛起&#xff0c;或者應用程序正在以蝸牛的速度運行&#xff0c;并且有人喘著氣想要您解決問題&#xff0c;然后再去解決。 您的應用程序意外掛起的可能原因之一是稱為死鎖的線程問題。 無需贅…

前端的學習之旅

Html學習筆記1 特殊符號&#xff1a;html中對換行縮進空格不敏感&#xff0c;都只會解析成一個空格 空格&#xff1a; < : < > :$gt; 版權符號&#xff1a;&copy&#xff1b; 表格&#xff1a;1 表示表格&#xff1a;table表示表格 tr&#xff1a;…

使用Vue.js和Axios從第三方API獲取數據 — SitePoint

更多的往往不是&#xff0c;建立你的JavaScript應用程序時&#xff0c;你會想把數據從遠程源或消耗一個[ API ]&#xff08;https&#xff1a;/ /恩。維基百科。org /維基/ application_programming_interface&#xff09;。我最近看了一些[公開]&#xff08;https://github.co…

區位碼怎么知道點陣里的起始點_自身免疫疾病的GAPS起始飲食改良版

寫這篇文章的原因如果您已經關注我的博客一段時間&#xff0c;您知道我開始使用GAPS飲食&#xff0c;然后轉換到AIP飲食&#xff0c;因為我仍在努力治療炎癥和自身免疫的發作。 Katy Haldiman 有同樣的經歷&#xff0c;我們并不孤單。許多患有自身免疫性疾病的人在 GAPS 上掙扎…

Linux存儲保護,談談Linux中的存儲保護

談談Linux中的存儲保護以下討論的內容是以i386平臺為基礎的Linux將4G的地址劃分為用戶空間和內核空間兩部分。在Linux內核的低版本中(2。0。X)&#xff0c;通常0-3G為用戶空間&#xff0c;3G-4G為內核空間。這個分界點是可以可以改動的。正是這個分界點的存在&#xff0c;限制了…

004-JQuery屬性

添加與刪除屬性CSS類HTML代碼/文本/值添加與刪除屬性 attr(name|properties|key,value|fn) &#xff1a;設置或返回被選元素的屬性值 removeAttr(name) &#xff1a;從每一個匹配的元素中刪除name屬性 prop(name|properties|key,value|fn) &#xff1a;獲取在匹配的元素集中的第…

預熱您的JVM –超快速生產服務器和IDE

幾個月前&#xff0c;我正在閱讀Java中的復雜事件處理以及實現低延遲的方法。 在我長達一個小時的研究結束時&#xff0c;我發現即使您的應用程序編寫正確并且您的方法主要在0&#xff08;log n&#xff09;的時間內運行&#xff0c;并且您正在使用某些前沿的硬件解決方案&…

微信小程序APP(商超營銷類)經驗總結

項目介紹 這是一款主打門店營銷的小程序。包括首頁、門店、營銷、個人設置、登錄、數據統計展示、營銷設置等。 本來要獨立完成整個項目&#xff0c;包括前后端一套的&#xff0c;有些意外因素&#xff0c;項目臨時收尾&#xff08;說明&#xff1a;只完成了前端的部分&#…