Fork/Join框架
生活随笔
收集整理的這篇文章主要介紹了
Fork/Join框架
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Fork就是把大任務切分為若干子任務并行執行,Join就是合并這些子任務的執行結果,最后得到這個大任務的結果。
要使用ForkJoin框架,必須首先創建ForkJoin任務。它提供在任務中執行fork()和join()操作的機制。
Fork/Join框架提供了以下兩個子類:
1:RecursiveAction:用于沒有返回結果的任務
2:RecursiveTask:用于有返回結果的任務
ForkJoinPool:ForkJoinTask需要通過ForkJoinPool來執行
ForkJoinPool由ForkJoinTask數組和ForkJoinWorkerThread數組組成,ForkJoinTask數組負責將存放程序提交給ForkJoinPool的任務,而ForkJoinWorkerThread數組負責執行這些任務。
計算 1+2+3+4+......+100的結果示例:
1 class CountTask extends RecursiveTask<Integer>{//因為是有返回,所以繼承RecursiveTask 2 private static final int THRESHOLD = 10;//閾值 3 private int start; 4 private int end; 5 public CountTask(int start, int end){ 6 this.start = start; 7 this.end = end; 8 } 9 @Override 10 protected Integer compute(){ 11 int sum = 0; 12 //如果任務足夠小就計算任務 13 boolean canCompute = (end - start) <= THRESHOLD; 14 if (canCompute){ 15 for (int i = start; i <= end; i++){ 16 sum += i; 17 } 18 }else { 19 //如果任務大于閾值,就分裂成兩個子任務計算 20 int middle = (start + end) / 2; 21 CountTask leftTask = new CountTask(start, middle); 22 CountTask rightTask = new CountTask(middle + 1, end); 23 //執行子任務 24 leftTask.fork(); 25 rightTask.fork(); 26 //等待子任務執行完,并得到計算結果 27 int leftResult = leftTask.join(); 28 int rightResult = rightTask.join(); 29 //合并子任務 30 sum = leftResult + rightResult; 31 } 32 return sum; 33 } 34 public static void main(String[] args){ 35 ForkJoinPool forkJoinPool = new ForkJoinPool(); 36 //生成一個計算任務,負責計算1+2+3+4 37 CountTask task = new CountTask(1, 100); 38 //執行子任務 39 Future<Integer> result = forkJoinPool.submit(task); 40 try { 41 System.out.println(result.get()); 42 }catch (InterruptedException e){ 43 }catch (ExecutionException e){ 44 } 45 } 46 }ForkJoinTask與一般任務的主要區別在于它實現compute方法。
?
轉載于:https://www.cnblogs.com/xcyz/p/8030126.html
總結
以上是生活随笔為你收集整理的Fork/Join框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TouTiao开源项目 分析笔记9 实现
- 下一篇: 可打开可关闭的选项卡,单纯无污染,改改样