Fork/Join框架

java 5開始引入了Executor和ExecutorService接口以及實現這兩個接口的類以後,使得java在併發支持上獲得了進一步的提高。
執行器框架(Executor Framework)將任務的建立和執行進行了分離,經過這個框架,只須要實現Runnable接口的對象和使用Executor對象,而後將Runnable對象發送給執行器。執行器再負責運行這些任務所須要的線程,包括線程的建立,線程的管理以及線程的結束。

java 7則更進一步,它包括了ExecutorService接口的另外一種實現,用來解決特殊類型的問題,它就是Fork/Join框架,有時也稱分解/合併框架。
Fork/Join框架是用來解決可以經過分治技術將問題拆分紅小任務的問題。
在一個任務中,先檢查將要解決的問題的大小,若是大於一個設定的大小,那就將問題拆分紅能夠經過框架來執行的小任務。若是問題的大小比設定的大小要小,就能夠直接在任務裏面解決這個問題,而後根據須要返回任務的結果。
沒有固定的公式來決定問題的參考大小,從而決定一個任務是須要進行拆分或者不須要拆分,拆分與否是依賴於任務自己的特性。

將ForkJoinPool類看做一個特殊的Executor執行器類型,這個框架基於如下兩種操做:
1.分解(Fork)操做:當須要將一個任務拆分紅更小的多個任務時,在框架中執行這些任務。
2.合併(Join)操做:當一個主任務等待其建立的多個子任務的完成執行。

Fork/Join框架和執行器框架(Executor Framework)主要區別在於:工做竊取算法(Work-Stealing Algorithm)。
與執行器框架不一樣,使用Join操做讓一個主任務等待它所建立的子任務的完成,執行這個任務的線程稱之爲工做者線程(Work Thread)。工做者線程尋找其餘仍未被執行的任務,而後開始執行。經過這種方式,這些線程在運行時擁有全部的優勢,進而提高應用程序的性能。
爲了達到這個目標,經過Fork/Join框架執行的任務有如下限制:
1.任務只能使用fork()和join()操做當同步機制。若是使用其餘的同步機制,工做者線程就不能執行其餘任務,固然這任務是在同步操做裏時。好比,若是Fork/Join框架中將一個任務休眠,正在執行這個任務的工做者線程在休眠期內不能執行另外一個任務。
2.任務不能執行I/O操做,好比文件數據的讀取與寫入。
3.任務不能拋出非運行時異常,必須在代碼中處理掉這些異常。

Fork/Join框架的核心是由如下兩個類組成的:
1.ForkJoinPool:這個類實現了ExecutorService接口和工做竊取算法。它管理工做者線程,並提供任務的狀態信息,以及任務的執行信息。
2.ForkJoinTask:這個類是一個將在ForkJoinPool中執行的任務的基類。

Fork/Join框架提供了再一個任務裏執行fork()和join()操做的機制和控制任務狀態的方法。
一般,爲了實現Fork/Join任務,須要實現一個如下兩個類之一的子類:
1.RecursiveAction:用於任務沒有返回結果的場景。
2.RecursiveTask:用於任務有返回結果的場景。java

相關文章
相關標籤/搜索