简介

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地址

https://gitee.com/zhuayng/foundation-study/blob/develop/JavaBasis/JUC/src/main/java/com/yxkj/juc/c_003/ForkJoinPoolDemo.java

最新文章

  1. 在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入
  2. 【Java EE 学习 83 上】【SpringMVC】【基本使用方法】
  3. Python文件格式化写入
  4. 【鸡渣饲料系列】《Introdution to 3D Game Programming With DirectX11》 代码转移至vs2015
  5. Dinic
  6. jsp调用javabean出现错误HTTP Status 500 - Unable to compile class for JSP
  7. iOS中webView加载URL需要处理特殊字符
  8. HTTP状态码(HTTP Status codes)简介
  9. python3.4 伪装成浏览器获取页面信息失败
  10. 使用jquery模拟键盘事件,但window系统并不会真的响应事件,只是浏览器当前页面会响应而已
  11. Ubuntu下如何解压各类文件
  12. 超超超简单的bfs——POJ-3278
  13. ansible 批量安装zabbix agentd客户端
  14. Charles使用心得总结
  15. newJob_newFell
  16. java垃圾回收机制GC
  17. rocketMQ安装部署详细解析
  18. loj 10000 活动安排
  19. Android 从相机或相册或获取图片(转)
  20. eclipse 安装properties编辑器,显示中文

热门文章

  1. BUG 记录:移位运算与扩展欧几里得算法
  2. 使用 Android Studio 开发工具创建一个 Android 应用程序,显示一行文字“Hello Android”,并将应用程序的名称更改为“FirstApp”。
  3. 编写Java程序,实现客户端向服务端上传文件的功能
  4. Oracle对表空间、用户、用户权限的操作
  5. 从零开始学springboot-1.创建项目
  6. Salesforce LWC学习(三十九) lwc下quick action的recordId的问题和解决方案
  7. Linux常用命令,新手可以看看
  8. 基于node和npm的命令行工具——tive-cli
  9. 官网下载mysql的方法
  10. 论文翻译:2021_Semi-Blind Source Separation for Nonlinear Acoustic Echo Cancellation