ForkJoinPool简单使用
简介
ForkJoinPool的优势在于,可以充分利用多cpu,多核cpu的优势,把一个任务拆分成多个“小任务”,把多个“小任务”放到多个处理器核心上并行执行,当多个“小任务”执行完成之后,再将这些执行结果合并起来即可。
适用场景:最适合的是计算密集型的任务,如果存在 I/O,线程间同步,sleep() 等会造成线程长时间阻塞的情况。
代码
复制static int[] nums=new int[1000000];
static final int MAX_NUM=500;
static Random r=new Random();
static {
for (int i = 0; i < nums.length; i++) {
nums[i]=r.nextInt(MAX_NUM);
}
System.out.println("nums总和为:-->"+ Arrays.stream(nums).sum());
}
/**
* 继承RecursiveTask有返回值
*
*
**/
public static class AddTaskRet extends RecursiveTask<Long>{
private static final long serialVersionUID = 1L;
int start, end;
AddTaskRet(int s, int e) {
start = s;
end = e;
}
@Override
protected Long compute() {
//如果计算的数小于500,则一个线程进行计算即可
if(end-start <= MAX_NUM) {
long sum = 0L;
for(int i=start; i<end; i++){
sum += nums[i];
}
return sum;
}
//大于500,这里分成两个线程去进行计算
int middle = start + (end-start)/2;
AddTaskRet subTask1 = new AddTaskRet(start, middle);
AddTaskRet subTask2 = new AddTaskRet(middle, end);
//执行两个任务
subTask1.fork();
subTask2.fork();
//把两个小任务累加的结果合并起来
return subTask1.join() + subTask2.join();
}
}
/**
* 继承RecursiveAction,无返回值
*
*
**/
public static class AddTask extends RecursiveAction{
int start, end;
AddTask(int s, int e) {
start = s;
end = e;
}
@Override
protected void compute() {
if(end-start <= MAX_NUM) {
long sum = 0L;
for(int i=start; i<end; i++){
sum += nums[i];
}
System.out.println("from:" + start + " to:" + end + " = " + sum);
} else {
int middle = start + (end-start)/2;
AddTask subTask1 = new AddTask(start, middle);
AddTask subTask2 = new AddTask(middle, end);
subTask1.fork();
subTask2.fork();
}
}
}
/**
* @Description:
* @Author: zhuyang
* @Date: 2022/1/17 19:36
* @return: void
**/
public void poolDemo(){
ForkJoinPool fjp = new ForkJoinPool();
AddTaskRet task = new AddTaskRet(0, nums.length);
//进行执行任务
fjp.execute(task);
//获取结果
long result = task.join();
System.out.println("多任务分片执行结果为---->"+result);
}
Gitee地址
XFS
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)