并发工具类——forkjoin
1:forkjion里面的重要的概念
分而治之:一个大的事情平均分成几个相同小的事情,如果没有达到最小的要求,就继续分,一直分到达到的要求。
工作密取:一个电脑的线程数是有限的,如果分而治之的线程很多,就会形成线程的队列,这里面就会有完成的快和慢的不同线程。
快的线程执行完成以后,就会把慢的队列拿过来进行执行。
继承两个类,RecursiveTask可以有返回值。RecursiveAction没有返回值。还可以使用同步或异步方式提交,invoke同步,submit、execute异步方式。
代码具体的实现
1 public static class SumTask extends RecursiveTask<Integer>{ 2 private final static Integer FLAG = 5; 3 4 private int[] num; 5 6 public SumTask(int[] num){ 7 this.num = num; 8 } 9 10 @Override 11 protected Integer compute() { 12 if(num.length<=FLAG){ 13 int count =0; 14 for (Integer i:num){ 15 count += i; 16 } 17 return count; 18 }else{ 19 int len = num.length/2; 20 SumTask task = new SumTask(Arrays.copyOfRange(num,0,len)); 21 SumTask task1 = new SumTask(Arrays.copyOfRange(num,len,num.length)); 22 invokeAll(task,task1); 23 return task.join()+task1.join(); 24 } 25 } 26 } 27 28 public static void main(String[] args) { 29 int[] nums = new int[]{3,61,23,45,56,67,78,89}; 30 int count =0; 31 for (Integer i :nums){ 32 count += i; 33 } 34 System.out.println("for计数:"+count); 35 //初始化 36 ForkJoinPool pool = new ForkJoinPool(); 37 SumTask task = new SumTask(nums); 38 39 pool.invoke(task); 40 41 System.out.println("forkjoin计数:"+task.join()); 42 }

浙公网安备 33010602011771号