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到你看到 ...
随机推荐
- 线上CPU飙升100%问题排查
本文转载自线上CPU飙升100%问题排查 引子 对于互联网公司,线上CPU飙升的问题很常见(例如某个活动开始,流量突然飙升时),按照本文的步骤排查,基本1分钟即可搞定!特此整理排查方法一篇,供大家参考 ...
- SQL EXPLAIN解析
本文转载自MySQL性能优化最佳实践 - 08 SQL EXPLAIN解析 什么是归并排序? 如果需要排序的数据超过了sort_buffer_size的大小,说明无法在内存中完成排序,就需要写到临时文 ...
- webpack4.X核心工具库之tapable实例对象Hook
一.tapable简介 tapable为webpack底层的核心工具库,webpack许多功能的实现都是跟它密不可分的,webpack的编译流程为配置初始化--->内容编译--->输出编译 ...
- 【Notes_9】现代图形学入门——光线追踪(基本原理)
跟着闫令琪老师的课程学习,总结自己学习到的知识点 课程网址GAMES101 B站课程地址GAMES101 课程资料百度网盘[提取码:0000] 目录 光线追踪 为什么要光线追踪 soft shadow ...
- oracle 19c 导入 12c ORA-39002 ORA-39358
直接用19c导出的dmp文件导入到12c,报错: ORA-39002: invalid operation ORA-39358: Export dump file version 19.0.0.0.0 ...
- KMP(超详细复杂度分析)
从 stackoverflow中找到了一个时间复杂度分析很棒的链接 https://www.inf.hs-flensburg.de/lang/algorithmen/pattern/kmpen.htm ...
- Python基础之:Python中的流程控制
目录 简介 while语句 if 语句 for语句 Break Continue pass 简介 流程控制无非就是if else之类的控制语句,今天我们来看一下Python中的流程控制会有什么不太一样 ...
- 剑指 Offer 53 - I. 在排序数组中查找数字 I + 二分法
剑指 Offer 53 - I. 在排序数组中查找数字 I Offer_53_1 题目描述 方法一:使用HashMap package com.walegarrett.offer; /** * @Au ...
- Bullet碰撞检测
DBVT 在bullet 引擎中是很基础且重要的一个数据结构,本质上是一个可以动态更新的AABB树. 碰撞响应的分析 约束分类:可积约束,不可积约束 ,摩擦力(见[1]第四章) 整个bullet在动力 ...
- Python字典与集合
一 字典创建.访问.添加.删除.修改.内建函数.内建方法 创建,列表不能作为键,因为键不能变?字典也不能作为键 dict1 = {} dict2 = {'name':'qq','sex':'male' ...