Java fork join ForkJoinPool 用法例子
生活随笔
收集整理的這篇文章主要介紹了
Java fork join ForkJoinPool 用法例子
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本例是把一個大的數組求和的計算的大任務分解到在小范圍內求和的小任務,然后把這些小任務之和加起來就是所求之結果。
?技術:JDK8.0,?Java fork-join模式下的RecursiveTask技術,override compute().?
[java] view plaincopy print?- /**?
- ?*?Author:?Bigtree?
- ?*?本例是把一個大的數組求和的計算的大任務分解到在小范圍內求和的小任務,然后把這些小任務之和加起來就是所求之結果。?
- ?*?技術:?
- ?*?java?fork-join模式下的RecursiveTask技術,override?compute().??
- ?*/??
- ??
- import?java.util.*;??
- import?java.util.concurrent.*;??
- class?Caltask?extends?RecursiveTask<Long>{??
- ????private?static?final?int?THRESHOLD?=?1000;?//how?many?numbers?one?thread?can?calculate??
- ????private?long?data[];??
- ????private?int?start;??
- ????private?int?end;??
- ??????
- ????public?Caltask(long[]?inputData,int?start,?int?end){??
- ????????data=inputData;??
- ????????this.start=start;??
- ????????this.end=end;??
- ????}??
- ????@Override??
- ????protected?Long?compute()?{??
- ????????Long?sumResult=0L;??
- ????????if((end?-?start)?<=?THRESHOLD?){??
- ??????????for(int?index=start;?index<end;index++)?{??
- ??????????????sumResult?+=?data[index];??
- ???????????}??
- ?????????}???
- ????????else?{?//parallel?computing??
- ????????????int?step=(end-start)/THRESHOLD;??
- ????????????if(((end-start)%THRESHOLD)>0)??????
- ????????????????step+=1;??????????????
- ????????????ArrayList<Caltask>?tasks?=?new?ArrayList<>();??
- ????????????int?pos=start;??
- ????????????int?lastposition;?????????????
- ????????????for(int?i=0;i<step;i++){??
- ?????????????lastposition=pos+THRESHOLD;????????????????
- ??????????????if(lastposition>end)???
- ??????????????????lastposition=end;?????????????
- ??????????????Caltask?onetask=?new?Caltask(data,pos,lastposition);??
- ??????????????pos=lastposition;??
- ??????????????tasks.add(onetask);??
- ??????????????onetask.fork();??
- ????????????}?????????????
- ????????????for(Caltask?mtask?:?tasks){??
- ????????????????sumResult?+=?mtask.join();????????????????
- ????????????}??
- ????????}??
- ????????return?sumResult;??
- ????}??
- ?}??
- ??
- ?public?class?forkjoincompute?{??
- ????public?static?void?ForkJoinShow(){??
- ????????long?data[]?=?new?long[20001];??
- ????????for(long?i=0;i<data.length;i++){??
- ????????????data[(int)?i]=?i?+?1;??
- ????????}??
- ????????ForkJoinPool?mypool=?ForkJoinPool.commonPool();??
- ????????Future<Long>?myfuture?=?mypool.submit(?new?Caltask(data,0,data.length));??
- ????????try{??
- ??????????long?result=myfuture.get();??
- ??????????System.out.println("forkjoincompute():computed?final?result="+result);??
- ????????}?catch(InterruptedException?e){??
- ????????????e.printStackTrace();??????????????
- ????????}?catch?(ExecutionException?e)?{??
- ????????????//?TODO?Auto-generated?catch?block??
- ????????????e.printStackTrace();??
- ????????}?????????
- ????????mypool.shutdown();????????
- ????}??
- }??
- ??
輸出結果:
forkjoincompute():computed final result=200030001
轉載于:https://www.cnblogs.com/Free-Thinker/p/6231728.html
總結
以上是生活随笔為你收集整理的Java fork join ForkJoinPool 用法例子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个好听的校斗群名字
- 下一篇: java 过滤器Filter