如果我们需要处理一大批数据,但是没有处理这批数据的能力,就可以使用分而治之的方式.fork/join框架就是对这种方式的体现.
ForkJoinTask 接口的实现类: RecursiveTask 有返回值 RecursiveAction 无返回值
demo:
import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import java.util.concurrent.RecursiveTask;public class TestForkJoin{/*** ForkJoinTask 接口下的继承类 RecursiveTask 有返回值* RecursiveAction 无返回值** 计算求和*/private static class TaskDemo extends RecursiveTask<Long> { //继承RecursiveTaskprivate static final int NUM = 10; //数据个数大于10 则使用分而治之 方式private int start;private int end;public TaskDemo(int start, int end){this.start = start;this.end = end;}@Overrideprotected Long compute() {Long sum = 0L;if((end - start + 1) < NUM){for(int i = start; i <= end; i++){sum += i;}}else{int step = (end - start)/10; // 10 子线程数 step 每个子线程处理的数据量List<TaskDemo> list = new ArrayList<TaskDemo>();int pos = start;for(int i = 0; i < 10; i++){int lastOne = pos + step;if(lastOne > end){lastOne = end;}TaskDemo taskDemo = new TaskDemo(pos, lastOne);pos += step + 1;list.add(taskDemo);taskDemo.fork(); //生成子线程执行任务}for(TaskDemo task : list){sum += task.join(); //获取子线程返回的结果}}return sum;}}public static void main(String[] args) {ForkJoinPool forkJoinPool = new ForkJoinPool(); //forkJoinPool 连接池TaskDemo taskDemo = new TaskDemo(1, 12);ForkJoinTask<Long> task = forkJoinPool.submit(taskDemo);Long result = null; //会阻塞 直到子线程都执行完try {result = task.get();System.out.println(result);} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}forkJoinPool.shutdown();} }结果显示:
78