- 对于一些分解单元明确,但是分解数不明确的分组计算,可以考虑使用 fork in,很明显这里需要使用递归,具体的做法是利用明确的分解单元作为递归结束的条件,对任务进行二分(或者其他分解),达到任务分组的效果。
-
import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; public class SumTest { public static void main(String[] args) throws Exception { ForkJoinPool pool= new ForkJoinPool(); // 从1累加到100000000,先定义了一个任务 SumTask task = new SumTask(1, 100000000); // 将这个任务提交 ForkJoinTask<Long> result = pool.submit(task); // 轮询任务进度,直到任务完成 do{ System.out.println("main thread count " + pool.getActiveThreadCount()); System.out.println("main paralelism" + pool.getParallelism()); try{ Thread.sleep(50); }catch (InterruptedException e){ e.printStackTrace(); } }while (!task.isDone()); System.out.println(( result).get().toString()); } }
import java.util.concurrent.RecursiveTask; /** * 继承RecursiveTask类,需要重写compute方法 */ public class SumTask extends RecursiveTask<Long> { private int start; private int end; public SumTask(int start, int end) { this.start = start; this.end = end; } private static final int THREAD_HOLD = 5; @Override protected Long compute(){ Long sum = 0L; // 这里就是 算法的核心,使用递归算法判断当前是否可以直接计算 boolean canComputer = (end - start) <= THREAD_HOLD; if (canComputer){ for (int i = start; i <= end; i++){ sum = sum + i; } }else { // 如果不可以直接进行计算,则将任务分解为两个任务,开始递归 int middle = (start + end) / 2; SumTask sumTask1 = new SumTask(start, middle); SumTask sumTask2 = new SumTask(middle, end); invokeAll(sumTask1, sumTask2); Long sum1 = sumTask1.join(); Long sum2 = sumTask2.join(); sum = sum1 + sum2; } return sum; } }
java基础 fork in
最新推荐文章于 2021-11-12 16:04:24 发布