本例是把一个大的数组求和的计算的大任务分解到在小范围内求和的小任务,然后把这些小任务之和加起来就是所求之结果。

技术:JDK8.0, Javafork-join模式下的RecursiveTask技术,override compute().

  1. /**
  2. * Author: Bigtree
  3. * 本例是把一个大的数组求和的计算的大任务分解到在小范围内求和的小任务,然后把这些小任务之和加起来就是所求之结果。
  4. * 技术:
  5. * java fork-join模式下的RecursiveTask技术,override compute().
  6. */
  7. import java.util.*;
  8. import java.util.concurrent.*;
  9. class Caltask extends RecursiveTask<Long>{
  10. private static final int THRESHOLD = 1000; //how many numbers one thread can calculate
  11. private long data[];
  12. private int start;
  13. private int end;
  14. public Caltask(long[] inputData,int start, int end){
  15. data=inputData;
  16. this.start=start;
  17. this.end=end;
  18. }
  19. @Override
  20. protected Long compute() {
  21. Long sumResult=0L;
  22. if((end - start) <= THRESHOLD ){
  23. for(int index=start; index<end;index++) {
  24. sumResult += data[index];
  25. }
  26. }
  27. else { //parallel computing
  28. int step=(end-start)/THRESHOLD;
  29. if(((end-start)%THRESHOLD)>0)
  30. step+=1;
  31. ArrayList<Caltask> tasks = new ArrayList<>();
  32. int pos=start;
  33. int lastposition;
  34. for(int i=0;i<step;i++){
  35. lastposition=pos+THRESHOLD;
  36. if(lastposition>end)
  37. lastposition=end;
  38. Caltask onetask= new Caltask(data,pos,lastposition);
  39. pos=lastposition;
  40. tasks.add(onetask);
  41. onetask.fork();
  42. }
  43. for(Caltask mtask : tasks){
  44. sumResult += mtask.join();
  45. }
  46. }
  47. return sumResult;
  48. }
  49. }
  50. public class forkjoincompute {
  51. public static void ForkJoinShow(){
  52. long data[] = new long[20001];
  53. for(long i=0;i<data.length;i++){
  54. data[(int) i]= i + 1;
  55. }
  56. ForkJoinPool mypool= ForkJoinPool.commonPool();
  57. Future<Long> myfuture = mypool.submit( new Caltask(data,0,data.length));
  58. try{
  59. long result=myfuture.get();
  60. System.out.println("forkjoincompute():computed final result="+result);
  61. } catch(InterruptedException e){
  62. e.printStackTrace();
  63. } catch (ExecutionException e) {
  64. // TODO Auto-generated catch block
  65. e.printStackTrace();
  66. }
  67. mypool.shutdown();
  68. }
  69. }

输出结果:

forkjoincompute():computed final result=200030001

05-13 20:03