Fork/Join框架(一)引言

杜老師說 2022-01-07 15:01:18 阅读数:110

fork join 框架 引言

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

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

引言

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

執行者框架將任務的創建與執行分離。有了它,你只要實現Runnable對象和使用Executor對象。你提交Runnable任務給執行者,它創建、管理線程來執行這些任務。

Java 7更進一步,包括一個面向特定問題的ExecutorService接口的額外實現,它就是Fork/Join框架。

這個框架被設計用來解决可以使用分而治之技術將任務分解成更小的問題。在一個任務中,檢查你想要解决問題的大小,如果它大於一個既定的大小,把它分解成更小的任務,然後用這個框架來執行。如果問題的大小是小於既定的大小,你直接在任務中解决這問題。它返回一個可選地結果。以下圖總結了這個概念:

1

沒有公式來確定問題的參數大小,所以你可以根據它的特點來確定一個任務是否可以被細分。你可以參考任務處理元素的大小和預估任務執行時間來確定子任務大小。你需要解决的問題是測試不同的參考大小來選擇最好的一個。你可以將ForkJoinPool作為一種特殊的執行者來考慮。

這個框架基於以下兩種操作:

  • fork操作:當你把任務分成更小的任務和使用這個框架執行它們。
  • join操作:當一個任務等待它創建的任務的結束。

Fork/Join 和Executor框架主要的區別是work-stealing算法。不像Executor框架,當一個任務正在等待它使用join操作創建的子任務的結 束時,執行這個任務的線程(工作線程)查找其他未被執行的任務並開始它的執行。通過這種方式,線程充分利用它們的運行時間,從而提高了應用程序的性能。

為實現這個目標,Fork/Join框架執行的任務有以下局限性:

  • 任務只能使用fork()和join()操作,作為同步機制。如果使用其他同步機制,工作線程不能執行其他任務,當它們在同步操作時。比如,在Fork/Join框架中,你使任務進入睡眠,正在執行這個任務的工作線程將不會執行其他任務,在這睡眠期間內。
  • 任務不應該執行I/O操作,如讀或寫數據文件。
  • 任務不能拋出檢查异常,它必須包括必要的代碼來處理它們。

Fork/Join框架的核心是由以下兩個類:

  • ForkJoinPool:它實現ExecutorService接口和work-stealing算法。它管理工作線程和提供關於任務的狀態和它們執行的信息。
  • ForkJoinTask: 它是將在ForkJoinPool中執行的任務的基類。它提供在任務中執行fork()和join()操作的機制,並且這兩個方法控制任務的狀態。通常, 為了實現你的Fork/Join任務,你將實現兩個子類的子類的類:RecursiveAction對於沒有返回結果的任務和RecursiveTask 對於返回結果的任務。

本章有5個指南,告訴你如何使Fork/Join框架有效地工作。

原創文章,轉載請注明: 轉載自並發編程網 – ifeve.com本文鏈接地址: Fork/Join框架(一)引言

FavoriteLoading添加本文到我的收藏
版权声明:本文为[杜老師說]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201071501178651.html