Fork/Join
用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。
多线程的目的不仅仅是提高程序运行的性能,但是可以充分利用CPU资源
fork() 在当前线程运行的线程池中安排一个异步执行。简单的理解就是再创建一个子任务。
join() 当任务完成的时候返回计算结果。
invoke() 开始执行任务,如果必要,等待计算完成。
举例:
实现1 到 100 相加
1 public class Demo extends RecursiveTask<Integer>{ 2 3 private int begin; 4 private int end; 5 6 public Demo(int begin, int end) { 7 this.begin = begin; 8 this.end = end; 9 } 10 11 @Override 12 protected Integer compute() { 13 int sum = 0; 14 //拆分任务 15 if (end - begin <= 2){ 16 for (int i = begin;i<=end;i++){ 17 sum += i; 18 } 19 }else { 20 //拆分 21 Demo d1 = new Demo(begin,(begin+end)/2); 22 Demo d2 = new Demo((begin+end)/2+1,end); 23 24 d1.fork(); 25 d2.fork(); 26 27 Integer a = d1.join(); 28 Integer b = d2.join(); 29 sum = a+b; 30 } 31 return sum; 32 } 33 34 public static void main(String[] args) throws Exception { 35 ForkJoinPool pool = new ForkJoinPool(); 36 37 Future<Integer> future = pool.submit(new Demo(1,100)); 38 39 System.out.println("do something..."); 40 41 System.out.println("计算的值为:"+ future.get()); 42 43 } 44 }
Console:
do something...
计算的值为:5050