并发工具类——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     }

 

  

posted @ 2019-06-06 14:31  陌然浅笑  阅读(210)  评论(0)    收藏  举报