当前位置: 代码迷 >> 综合 >> Fork/Join框架
  详细解决方案

Fork/Join框架

热度:23   发布时间:2024-01-24 22:06:54.0

如果我们需要处理一大批数据,但是没有处理这批数据的能力,就可以使用分而治之的方式.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

  相关解决方案