什么是Fork/Join框架?
工作窃取算法:
步骤设计:
实验代码:
package com.duoduo.Thread; import java.util.concurrent.RecursiveTask; public class CountTask extends RecursiveTask<Integer>{ private static final int THREADHOLD=2; //定义阈值 private int start; private int end; public CountTask(int start,int end) { this.start=start; this.end=end; } @Override //计算函数 protected Integer compute() { int sum=0; boolean canCompute=(end-start)<=THREADHOLD; //如果任务足够小则直接计算 if(canCompute) { for(int i=start; i<=end;i++) { sum+=i; } //否则 大任务分解成为两个小任务计算 }else { int middle=(start+end)/2; //分解任务 递归函数 CountTask leftTask=new CountTask(start,middle); CountTask rightTask=new CountTask(middle+1,end); //执行子任务 leftTask.fork(); rightTask.fork(); //等待子任务结束后得到其结果 int leftResult=leftTask.join(); int rightResult=rightTask.join(); //合并子任务 sum=leftResult+rightResult; } return sum; } }
package com.duoduo.Thread; import com.duoduo.Thread.CountTask; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.Future; public class TestCountTask { public static void main(String []args) { ForkJoinPool forkJoinPool=new ForkJoinPool(); //生成一个计算任务 负责计算1+2+3+4 CountTask task=new CountTask(1,4); //执行任务 Future<Integer> result=forkJoinPool.submit(task); try { System.out.println(result.get()); }catch(InterruptedException e) { }catch (ExecutionException e) { } } }
实验总结:
异常处理:
public class TestCountTask { public static void main(String []args) { ForkJoinPool forkJoinPool=new ForkJoinPool(); //生成一个计算任务 负责计算1+2+3+4 CountTask task=new CountTask(1,4); //执行任务 Future<Integer> result=forkJoinPool.submit(task); try { System.out.println(result.get()); }catch(InterruptedException e) { }catch (ExecutionException e) { } //加了一行检测是否有异常抛出的代码 System.out.println(task.isCompletedAbnormally()); } }
证明无异常出现