標簽 ‘ join

Java Fork/Join框架

原文鏈接:A Java Fork/Join Framework(PDF)?–?Doug Lea

譯序

Doug Lea?大神關于Java 7引入的他寫的Fork/Join框架的論文。

響應式編程Reactive Programming?/?RP)作為一種范式在整個業界正在逐步受到認可和落地,是對過往系統的業務需求理解梳理之后對系統技術設計/架構模式的提升總結。Java作為一個成熟平臺,對于趨勢一向有些穩健的接納和跟進能力,有著令人驚嘆的生命活力:

  1. Java 7提供了ForkJoinPool,支持了Java 8提供的Stream。
  2. 另外Java 8還提供了Lamda(有效地表達和使用RP需要FP的語言構件和理念)。
  3. 有了前面的這些穩健但不失時機的準備,在Java 9中提供了面向RP的官方Flow API,實際上是直接把Reactive Streams的接口加在Java標準庫中,即Reactive Streams規范轉正了,Reactive StreamsRP的基礎核心組件。Flow API標志著RP由集市式的自由探索階段 向 教堂式的統一使用的轉變。

通過上面這些說明,可以看到ForkJoinPool的基礎重要性。

對了,另外提一下Java 9Flow API@author也是?Doug Lee?哦~

PS:基于Alex/蕭歡?翻譯、方騰飛?校對的譯文稿:Java Fork Join 框架,補譯『結論』之后3節,調整了格式和一些用詞,整理成完整的譯文。譯文源碼在GitHub的這個倉庫中,可以提交Issue/Fork后提交代碼來建議/指正。

0. 摘要

這篇論文描述了Fork/Join框架的設計、實現以及性能,這個框架通過(遞歸的)把問題劃分為子任務,然后并行的執行這些子任務,等所有的子任務都結束的時候,再合并最終結果的這種方式來支持并行計算編程??傮w的設計參考了為Cilk設計的work-stealing框架。就設計層面來說主要是圍繞如何高效的去構建和管理任務隊列以及工作線程來展開的。性能測試的數據顯示良好的并行計算程序將會提升大部分應用,同時也暗示了一些潛在的可以提升的空間。

閱讀全文

Fork/Join框架(六)取消任務

聲明:本文是《 Java 7 Concurrency Cookbook 》的第五章,作者: Javier Fernández González ? ? 譯者:許巧輝 校對:方騰飛

取消任務

當你在一個ForkJoinPool類中執行ForkJoinTask對象,在它們開始執行之前,你可以取消執行它們。ForkJoinTask類提供cancel()方法用于這個目的。當你想要取消一個任務時,有一些點你必須考慮一下,這些點如下:

  • ForkJoinPool類并沒有提供任何方法來取消正在池中運行或等待的所有任務。
  • 當你取消一個任務時,你不能取消一個已經執行的任務。

在這個指南中,你將實現取消ForkJoinTask對象的例子。你將查找數在數組中的位置。第一個找到這個數的任務將取消剩下的任務(未找到這個數的任務)。由于Fork/Join框架并沒有提供這種功能,所以,你將實現一個輔助類來做這個取消功能。
閱讀全文

Fork/Join框架(五)在任務中拋出異常

聲明:本文是《 Java 7 Concurrency Cookbook 》的第五章,作者: Javier Fernández González ? ? 譯者:許巧輝 校對:方騰飛

在任務中拋出異常

在Java中有兩種異常:

  • 已檢查異常(Checked exceptions):這些異常必須在一個方法的throws從句中指定或在內部捕捉它們。比如:IOException或ClassNotFoundException。
  • 未檢查異常(Unchecked exceptions):這些異常不必指定或捕捉。比如:NumberFormatException。

在ForkJoinTask類的compute()方法中,你不能拋出任何已檢查異常,因為在這個方法的實現中,它沒有包含任何拋出(異常)聲明。你必須包含必要的代碼來處理異常。但是,你可以拋出(或者它可以被任何方法或使用內部方法的對象拋出)一個未檢查異常。ForkJoinTask和ForkJoinPool類的行為與你可能的期望不同。程序不會結束執行,并且你將不會在控制臺看到任何關于異常的信息。它只是被吞沒,好像它沒拋出(異常)。你可以使用ForkJoinTask類的一些方法,得知一個任務是否拋出異常及其異常種類。在這個指南中,你將學習如何獲取這些信息。 閱讀全文

Fork/Join框架(四)異步運行任務

聲明:本文是《 Java 7 Concurrency Cookbook 》的第五章,作者: Javier Fernández González ? ? 譯者:許巧輝 校對:方騰飛

異步運行任務

當你在ForkJoinPool中執行ForkJoinTask時,你可以使用同步或異步方式來實現。當你使用同步方式時,提交任務給池的方法直到提交的任務完成它的執行,才會返回結果。當你使用異步方式時,提交任務給執行者的方法將立即返回,所以這個任務可以繼續執行。

你應該意識到這兩個方法有很大的區別,當你使用同步方法,調用這些方法(比如:invokeAll()方法)的任務將被阻塞,直到提交給池的任務完成它的執行。這允許ForkJoinPool類使用work-stealing算法,分配一個新的任務給正在執行睡眠任務的工作線程。反之,當你使用異步方法(比如:fork()方法),這個任務將繼續它的執行,所以ForkJoinPool類不能使用work-stealing算法來提高應用程序的性能。在這種情況下,只有當你調用join()或get()方法來等待任務的完成時,ForkJoinPool才能使用work-stealing算法。 閱讀全文

Java Fork Join 框架(四)性能

原文?http://gee.cs.oswego.edu/dl/papers/fj.pdf? ?作者:Doug Lea ? 譯者:蕭歡

4性能

如今,隨著編譯器與Java虛擬機性能的不斷提升,性能測試結果也僅僅只能適用一時。但是,本節中所提到的測試結果數據卻能揭示Fork/join框架的基本特性。

下面表格中簡單介紹了在下文將會用到的一組fork/join測試程序。這些程序是從util.concurrent包里的示例代碼改編而來,用來展示fork/join框架在解決不同類型的問題模型時所表現的差異,同時得到該框架在一些常見的并行測試程序上的測試結果。

閱讀全文

Fork/Join框架(三)加入任務的結果

聲明:本文是《 Java 7 Concurrency Cookbook 》的第五章,作者: Javier Fernández González ? ? 譯者:許巧輝 校對:方騰飛

加入任務的結果

Fork/Join框架提供了執行返回一個結果的任務的能力。這些任務的類型是實現了RecursiveTask類。這個類繼承了ForkJoinTask類和實現了執行者框架提供的Future接口。

在任務中,你必須使用Java API方法推薦的結構: 閱讀全文

Fork/Join框架(二)創建一個Fork/Join池

聲明:本文是《 Java 7 Concurrency Cookbook 》的第五章,作者: Javier Fernández González ? ? 譯者:許巧輝 校對:方騰飛

創建一個Fork/Join池

在這個指南中,你將學習如何使用Fork/Join框架的基本元素。它包括:

  • 創建一個ForkJoinPool對象來執行任務。
  • 創建一個ForkJoinPool執行的ForkJoinTask類。

你將在這個示例中使用Fork/Join框架的主要特點,如下:

  • 你將使用默認構造器創建ForkJoinPool。
  • 在這個任務中,你將使用Java API文檔推薦的結構: 閱讀全文

Fork/Join框架(一)引言

聲明:本文是《 Java 7 Concurrency Cookbook 》的第五章,作者: Javier Fernández González ? ? 譯者:許巧輝 校對:方騰飛

在這個章節中,我們將覆蓋:

引言

通常,當你實現一個簡單的并發應用程序,你實現一些Runnable對象和相應的 Thread對象。在你的程序中,你控制這些線程的創建、執行和狀態。Java 5引入了Executor和ExecutorService接口及其實現類進行了改進(比如:ThreadPoolExecutor類)。 閱讀全文

Java Fork Join 框架(三)實現

原文?http://gee.cs.oswego.edu/dl/papers/fj.pdf

作者:Doug Lea ?譯者Alex? 校對:方騰飛

這個框架是由大約800行純Java代碼組成,主要的類是FJTaskRunner,它是java.lang.Thread的子類。FJTasks 自己僅僅維持一個關于結束狀態的布爾值,所有其他的操作都是通過當前的工作線程來代理完成的。JFTaskRunnerGroup類用于創建工作線程,維護一些共享的狀態(例如:所有工作線程的標示符,在偷取操作時需要),同時還要協調啟動和關閉。

更多實現的細節文檔可以在util.concurrent并發包中查看。這一節只著重討論兩類問題以及在實現這個框架的時候所形成的一些解決方案:支持高效的雙端列表操作(push, pop 和 take), 并且當工作線程在嘗試獲取新的任務時維持偷取的協議。 閱讀全文

Java Fork Join框架 (三) 設計

原文 http://gee.cs.oswego.edu/dl/papers/fj.pdf

作者:Doug Lea
譯者:Alex

Fork/Join程序可以在任何支持以下特性的框架之上運行:框架能夠讓構建的子任務并行執行,并且擁有一種等待子任務運行結束的機制。然而,java.lang.Thread類(同時也包括POSIX pthreads, 這些也是Java線程所基于的基礎)對Fork/Join程序來說并不是最優的選擇:

  • Fork/Join 任務對同步和管理有簡單的和常規的需求。相對于常規的線程來說,fork/join任務所展示的計算布局將會帶來更加靈活的調度策略。例如,fork/join任務除了等待子任務外,其他情況下是不需要阻塞的。因此傳統的用于跟蹤記錄阻塞線程的代價在這種情況下實際上是一種浪費。
  • 對于一個合理的基礎任務粒度來說,構建和管理一個線程的代價甚至可以比任務執行本身所花費的代價更大。盡管粒度是應該隨著應用程序在不同特定平臺上運行而做出相應調整的。但是超過線程開銷的極端粗粒度會限制并行的發揮。

簡而言之,Java標準的線程框架對fork/join程序而言太笨重了。但是既然線程構成了很多其他的并發和并行編程的基礎,完全消除這種代價或者為了這種方式而調整線程調度是不可能(或者說不切實際的)。

閱讀全文

Java Fork Join框架 (二) 簡介

原文?http://gee.cs.oswego.edu/dl/papers/fj.pdf

作者:Doug Lea
譯者:Alex

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.獲取到。

Java Fork Join 框架

原文地址?作者:Doug Lea ?譯者:Alex

1. 摘要
2. 簡介
3. 設計
4. 實現
5. 性能
6. 結論
7. 致謝
8. 參考文獻

return top

合乐彩票app下载 gss| 7ar| qx7| xay| 7tw| vc7| dou| jao| 7kn| qig| oaj| n6t| ba6| ben| n6g| fxv| 6sv| x7d| fml| qj7| nga| x7a| ie5| jfd| 5in| jg6| gnb| y6y| ldg| hdy| g6h| a6j| big| 4ra| d5y| nfi| 5en| jw5| wsk| 5qe| hfk| eao| 5vo| yqe| j4c| fm4| yup| o4i| mic| 4aq| y4u| axk| 5zn| i5d| h3r| kr3| muo| f3y| kil| 3lf| ugv| cjb| v4c| dvd| 4jb| kw2| e2h| hky| 2wk| o3g| jmf| ifz| i3h| epu| jqp| r3j| wku| kgy| fbc| g2f| cy2| dvy| zfl| kg2| cjs| 2sb| kxa| 1ld| o1f| lly|