ForkJoinPool的工作原理和使用
场景:当任务很多,成千上万个,或者单个任务很大,执行起来很耗时间,这时,就可以把任务进行拆分,拆分成多个小任务去执行,然后小任务执行完毕后再把每个小任务执行的结果合并起来,这样就可以节省时间。
ForkJoinPool实现了ExecutorService接口,所以它也是一种线程池,做的工作就是,把一个任务拆分成若干个小任务执行,然后再把小任务执行的结果汇总。
下面是一个小例子:
//初始化一个ForkJoinPool
static ForkJoinPool pool = new ForkJoinPool(3,
ForkJoinPool.defaultForkJoinWorkerThreadFactory,
null,
true); //一个集合,模拟网站
static ArrayList<String> list = new ArrayList<>();
//集合中的数据
static void addList() {
list.add("www.baidu.com");
list.add("www.blog.csdn.net");
list.add("www.baidu.com");
list.add("www.blog.csdn.net");
list.add("www.baidu.com");
list.add("www.blog.csdn.net");
list.add("www.baidu.com");
list.add("www.blog.csdn.net");
list.add("www.baidu.com");
list.add("www.blog.csdn.net");
list.add("www.baidu.com");
list.add("www.blog.csdn.net");
list.add("www.baidu.com");
list.add("www.blog.csdn.net");
list.add("www.baidu.com");
list.add("www.blog.csdn.net");
list.add("www.baidu.com");
list.add("www.blog.csdn.net");
list.add("www.baidu.com");
list.add("www.blog.csdn.net");
list.add("www.baidu.com");
list.add("www.blog.csdn.net");
list.add("www.baidu.com");
list.add("www.blog.csdn.net");
list.add("www.baidu.com");
list.add("www.blog.csdn.net");
list.add("www.baidu.com");
list.add("www.blog.csdn.net");
list.add("www.baidu.com");
list.add("www.blog.csdn.net");
list.add("www.baidu.com");
list.add("www.blog.csdn.net");
list.add("www.baidu.com");
list.add("www.blog.csdn.net");
list.add("www.baidu.com");
list.add("www.blog.csdn.net");
list.add("www.baidu.com");
list.add("www.blog.csdn.net");
list.add("www.baidu.com");
list.add("www.blog.csdn.net");
list.add("www.baidu.com");
list.add("www.blog.csdn.net");
list.add("www.baidu.com");
list.add("www.blog.csdn.net");
list.add("www.baidu.com");
list.add("www.blog.csdn.net");
} public static void main(String[] args) throws ExecutionException, InterruptedException {
addList();
//提交任务
ForkJoinTask<String> task = pool.submit(new Work(list, 0, list.size()));
System.out.println(task.get()); } //模拟请求
public static String doRequest(String url, int index) {
return index + "--》请求测试:" + url + "\n";
} //需要继承RecursiveTask,来实现自己的拆分逻辑
static class Work extends RecursiveTask<String> {
List<String> list;
int start;
int end; public Work(List<String> list, int start, int end) {
this.list = list;
this.start = start;
this.end = end;
} @Override
protected String compute() {
int count = end - start;
String result = "";
//当任务小于10个时直接执行,否则就拆分
if (count <= 10) {
for (int i = 0; i<list.size(); i++) {
result += doRequest(list.get(i), i);
}
return result;
} else {
//获取任务数量索引的中间值
int x = (start + end) / 2;
//拆分任务
Work work1 = new Work(list, start, x);
work1.fork();
//拆分任务
Work work2 = new Work(list, x, end);
work2.fork();
//获取任务执行结果
result += work1.join();
result += work2.join();
return result;
}
}
}
执行逻辑:
第一步:
第二步:
第三步:
每一个线程有任务后,都会去拆分任务,当拆分的小任务满足执行条件后,就会去执行,然后按照层级,从拆分后最小的层级执行完任务,一层层向上回收任务结果,最后到ForkJoinTask中,然后就可以获取到每一个小任务执行的结果。
ForkJoinPool的工作原理和使用的更多相关文章
- 菜鸟学Struts2——Struts工作原理
在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...
- 【夯实Nginx基础】Nginx工作原理和优化、漏洞
本文地址 原文地址 本文提纲: 1. Nginx的模块与工作原理 2. Nginx的进程模型 3 . NginxFastCGI运行原理 3.1 什么是 FastCGI ...
- HashMap的工作原理
HashMap的工作原理 HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道HashTable和HashMap之间 ...
- 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 工作原理和相关组件(三)
RAC 工作原理和相关组件(三) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...
- ThreadLocal 工作原理、部分源码分析
1.大概去哪里看 ThreadLocal 其根本实现方法,是在Thread里面,有一个ThreadLocal.ThreadLocalMap属性 ThreadLocal.ThreadLocalMap t ...
- Servlet的生命周期及工作原理
Servlet生命周期分为三个阶段: 1,初始化阶段 调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...
- 代码管理工具 --- git的学习笔记二《git的工作原理》
通过几个问题来学习代码管理工具之git 一.git是什么?为什么要用它?使用它的好处?它与svn的区别,在Mac上,比较好用的git图形界面客户端有 git 是分布式的代码管理工具,使用它是因为,它便 ...
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- 浏览器内部工作原理--作者:Tali Garsiel
本篇内容为转载,主要用于个人学习使用,作者:Tali Garsiel 一.介绍 浏览器可以被认为是使用最广泛的软件,本文将介绍浏览器的工作原理,我们将看到,从你在地址栏输入google.com到你看到 ...
随机推荐
- net面试总结的题目
准备的面试题目. 1.private.protected.public.internal的访问权限? private : 私有成员,在类的内部才可以访问. protected :保护成员,该类内部和继 ...
- 怎么去掉右下角的thinkphp的图标
关闭thinkphp右下角的trace可以试试以下步骤: 1.在入口文件index.php 加入 define("APP_DEBUG", false); 2.在config.php ...
- 音视频+ffmpeg
雷霄骅:https://me.csdn.net/leixiaohua1020 致敬! 1.[总结]视音频编解码技术零基础学习方法 https://blog.csdn.net/leixiaohua102 ...
- HDFS 03 - 你能说说 HDFS 的写入和读取过程吗?
目录 1 - HDFS 文件的写入 1.1 写入过程 1.2 写入异常时的处理 1.3 写入的一致性 2 - HDFS 文件的读取 2.1 读取过程 2.2 读取异常时的处理 版权声明 1 - HDF ...
- 保姆级别学生党安装Clion IDE(面向华师同学)
保姆级别学生党安装Clion IDE(面向华师同学) 界面UI 废话不多说,直接上图 具备功能 UI美观 (下面会介绍) 基础的代码编写能力 大容量的IDE插件 (下面会介绍) 代码补全,以及搭配Ki ...
- 使用syncthing和蒲公英异地组网零成本实现多设备实时同步
设想一个场景,如果两台电脑之间可以共享一个文件夹,其中一个增删更改其中的内容时,另一个也能同步更新,而且速度不能太慢,最好是免费的.那么syncthing就可以满足这个要求.syncthing可以实现 ...
- 从零学脚手架(四)---babel
如果此篇对您有所帮助,在此求一个star.项目地址: OrcasTeam/my-cli 接下来介绍一个打包编译过程中一个极为重要的工具--babel. ES6的枷锁 细心的朋友可以知道,在之前打包编译 ...
- MySql历史与架构
MySQL 逻辑架构
- FHRP - 网关冗余协议
通常情况下,在终端设备进入网络前,都会有一个 Router 充当网络,作为第一跳的网络地址.但假设路由器发生故障,此时终端设备就无法再接入互联网. 为了防止这样的问题,一般会再加入一台路由器充当备份. ...
- canvas-修改图片亮度
canvas操作-修改图片亮度 目录 canvas操作-修改图片亮度 图片亮度的概念 下面用ps截图举一个例子: 调整图片亮度的方案 实现方案一 从RGB到HSV的转换 转换的公式 javascrip ...