ForkJoin
Fork/Join框架强调任务的分解。
该框架主要有Fork,join两个操作组成,Fork操作主要用于对任务和数据进行划分。join操作用于对各个部分的运行结果进行合并
该框架有一个重要的方法,叫做工作窃取法,当一个线程完成任务时,会去查看其它线程是否完成了任务,如果没有,就将窃取一部分任务来处理,提高效率和资源利用率
继承RecursiveTask类,重写compute方法。来创建线程任务
package com.luoKing.ForkJoin; import java.util.concurrent.RecursiveTask; public class ForkJTask extends RecursiveTask<Long>{ //计算1-10_0000_0000的和 //具体任务 private Long start; private Long end; private int temp = 5_0000;//门槛值 public ForkJTask(Long start, Long end) { this.start = start; this.end = end; } @Override protected Long compute() { if((end-start)<temp){ Long sum = 0L;//总结果 for (Long i = start; i <= end; i++) { sum +=i; } return sum; }else{ Long middle = (start+end)/2;//中间值 ForkJTask task1 = new ForkJTask(start, middle);//任务1 task1.fork();//拆分任务,将线程压入队列 ForkJTask task2 = new ForkJTask(middle + 1, end); task2.fork(); return task1.join()+task2.join();//合并结果 } } }
使用ForkJoinPool类来启动线程任务
package com.luoKing.ForkJoin; import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; public class test { public static void main(String[] args) throws ExecutionException, InterruptedException { ForkJoinPool forkJoinPool = new ForkJoinPool(); ForkJTask forkJTask = new ForkJTask(0L,10_0000_0000L); ForkJoinTask<Long> submit = forkJoinPool.submit(forkJTask); System.out.println(submit.get()); } }
Fork/Join框架的编程模式决定了它更适合具有递归操作的程序,通常需要程序员手动设置阈值。可操作性强
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决