Java多線程高並發中的Fork/Join框架機制詳解
1.Fork/Join框架簡介
Fork/Join 它可以將一個大的任務拆分成多個子任務進行並行處理,最後將子任務結果合並成最後的計算結果,並進行輸出。Fork/Join 框架要完成兩件事情:
Fork:把一個復雜任務進行分拆,大事化小 :把一個復雜任務進行分拆,大事化小
Join:把分拆任務的結果進行合並
在 Java 的 Fork/Join 框架中,使用兩個類完成上述操作:
ForkJoinTask: 我們要使用 Fork/Join 框架,首先需要創建一個 ForkJoin 任務。該類提供瞭在任務中執行 fork 和 join 的機制。通常情況下我們不需要直接集成 ForkJoinTask 類,隻需要繼承它的子類,Fork/Join 框架提供瞭兩個子類:
- RecursiveAction:用於沒有返回結果的任務
- RecursiveTask:用於有返回結果的任務
ForkJoinPool: ForkJoinTask 需要通過 ForkJoinPool 來執行。
RecursiveTask: 繼承後可以實現遞歸(自己調自己)調用的任務。
可以在jdk官方文檔中看到:
2.簡單應用
實現從 1 + 2 + … + 100 ,將它們拆分成多個小任務,分別求和,最終再將這些結果合並。
這裡就是參照官方文檔,先繼承RecursiveTask類,重寫其中的compute方法,然後定義有參構造,而ForkJoinTask需要通過 ForkJoinPool 來執行,所以還需要創建 分支合並池ForkJoinPool對象。
package test.forkjoin; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import java.util.concurrent.RecursiveTask; /** * */ class MyTask extends RecursiveTask<Integer> { //拆分差值不能超過10,每次計算10以內的連加操作 private static final Integer NUMBER = 10; private int begin; //拆分左區間的值 private int end; //拆分右區間的值 private int result; //最終結果 public MyTask(int begin,int end) { this.begin = begin; this.end = end; } @Override protected Integer compute() { //判斷區間差值是否大於10 if ((end - begin) <= NUMBER) { //將區間內的值依次相加 for (int i = begin; i <= end; i++) { result += i; } } else { //區間差值大於10,進一步拆分 //獲取中間值 int middle = (begin + end) / 2; //拆分的左區間 MyTask taskLeft = new MyTask(begin,middle); //拆分的右區間 MyTask taskRight = new MyTask(middle + 1,end); //fork方法進行拆分 taskLeft.fork(); taskRight.fork(); //join方法進行合並 result = taskLeft.join() + taskRight.join(); } return result; } } public class ForkJoinDemo { public static void main(String[] args) { //創建MyTask對象 MyTask myTask = new MyTask(1,100); //創建分支合並池對象 ForkJoinPool forkJoinPool = new ForkJoinPool(); ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(myTask); try { //獲取最終合並後的結果 Integer ans = forkJoinTask.get(); System.out.println(ans); } catch (Exception e) { e.printStackTrace(); }finally { //關閉池對象 forkJoinPool.shutdown(); } } }
到此這篇關於Java多線程高並發中的Fork/Join框架機制詳解的文章就介紹到這瞭,更多相關Java Fork/Join 框架內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java並發編程之Fork/Join框架的理解
- 輕輕松松吃透Java並發fork/join框架
- Java並發中的Fork/Join 框架機制詳解
- Java 並發編程之ForkJoin框架
- java代碼實現C盤文件統計工具