如果我们需要处理一大批数据,但是没有处理这批数据的能力,就可以使用分而治之的方式.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> { //继承RecursiveTask private static final int NUM = 10; //数据个数大于10 则使用分而治之 方式 private int start; private int end; public TaskDemo(int start, int end){ this.start = start; this.end = end; } @Override protected 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
来源:CSDN
作者:欣淡定
链接:https://blog.csdn.net/xindanding/article/details/103923583