生活随笔
收集整理的這篇文章主要介紹了
Java JUC工具类--ForkJoin
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
ForkJoin
- Fork/Join框架是JAVA7提供的一個(gè)用于并行執(zhí)行任務(wù)的框架,是一個(gè)把大任務(wù)分割成若干個(gè)小任務(wù),最終匯總每個(gè)小任務(wù)結(jié)果后得到大任務(wù)結(jié)果的框架
?
Fork/Join中兩個(gè)重要的類
- ForkJoinTask:使用該框架,需要?jiǎng)?chuàng)建一個(gè)ForkJoin任務(wù),它提供在任務(wù)中執(zhí)行fork和join操作的機(jī)制。
- 一般情況下,我們并不需要直接繼承ForkJoinTask類,只需要繼承它的子類,它的子類有兩個(gè):
- RecursiveAction:用于沒有返回結(jié)果的任務(wù)
- RecursiveTask:用于有返回結(jié)果的任務(wù)
- ForkJoinPool:任務(wù)ForkJoinTask需要通過ForkJoinPool來提交任務(wù)
package com.example.core.juc;import java.util.concurrent.*;public class UseForkJoin extends RecursiveTask<Integer> {//執(zhí)行計(jì)算并要求返回結(jié)果的需要繼承RecursiveTask<Integer>//RecursiveTask<Integer>其中Integer為計(jì)算的類型private static final int THRESHOLD = 2;//閾值,也就是拆分的原則private int start;private int end;public UseForkJoin(int start,int end){this.start = start;this.end = end;}@Overrideprotected Integer compute(){int sum = 0; //1+2+3+......+100boolean canCompute = (end - start) <= THRESHOLD;if(canCompute){for(int i = start;i<=end;i++){sum += i;}}else{//如果,任務(wù)數(shù)大于閾值的情況,就進(jìn)行拆分 fork操作 然后去join//1 + 100/2 = 50int middle = (start + end)/2;UseForkJoin leftTask = new UseForkJoin(start,middle);UseForkJoin rightTask = new UseForkJoin(middle+1,end);//執(zhí)行左右兩邊的任務(wù)leftTask.fork();rightTask.fork();//等待任務(wù)執(zhí)行完成之后,進(jìn)行獲取結(jié)果int leftResult = leftTask.join();int rightResult = rightTask.join();sum = leftResult + rightResult;}return sum;}public static void main(String[] args) throws InterruptedException, ExecutionException {ForkJoinPool pool = new ForkJoinPool();UseForkJoin ufj = new UseForkJoin(1,100);Future<Integer> result = pool.submit(ufj);System.out.println("最終的結(jié)果是:"+result.get());}
}
/*
output:
最終的結(jié)果是:5050*/
?
總結(jié)
以上是生活随笔為你收集整理的Java JUC工具类--ForkJoin的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。