场景:当任务很多,成千上万个,或者单个任务很大,执行起来很耗时间,这时,就可以把任务进行拆分,拆分成多个小任务去执行,然后小任务执行完毕后再把每个小任务执行的结果合并起来,这样就可以节省时间。

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的工作原理和使用的更多相关文章

  1. 菜鸟学Struts2——Struts工作原理

    在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...

  2. 【夯实Nginx基础】Nginx工作原理和优化、漏洞

    本文地址 原文地址 本文提纲: 1.  Nginx的模块与工作原理    2.  Nginx的进程模型    3 . NginxFastCGI运行原理        3.1 什么是 FastCGI   ...

  3. HashMap的工作原理

    HashMap的工作原理   HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道HashTable和HashMap之间 ...

  4. 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 工作原理和相关组件(三)

    RAC 工作原理和相关组件(三) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...

  5. ThreadLocal 工作原理、部分源码分析

    1.大概去哪里看 ThreadLocal 其根本实现方法,是在Thread里面,有一个ThreadLocal.ThreadLocalMap属性 ThreadLocal.ThreadLocalMap t ...

  6. Servlet的生命周期及工作原理

    Servlet生命周期分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...

  7. 代码管理工具 --- git的学习笔记二《git的工作原理》

    通过几个问题来学习代码管理工具之git 一.git是什么?为什么要用它?使用它的好处?它与svn的区别,在Mac上,比较好用的git图形界面客户端有 git 是分布式的代码管理工具,使用它是因为,它便 ...

  8. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  9. 浏览器内部工作原理--作者:Tali Garsiel

    本篇内容为转载,主要用于个人学习使用,作者:Tali Garsiel 一.介绍 浏览器可以被认为是使用最广泛的软件,本文将介绍浏览器的工作原理,我们将看到,从你在地址栏输入google.com到你看到 ...

随机推荐

  1. Spring—Document root element "beans", must match DOCTYPE root "null"分析及解决方法

    网上很多人说要把applicationContex.xml文件中加上如下第二行的<!DOCTYPE/>标签,说明DTD.<?xml version="1.0" e ...

  2. AWS Switching to an IAM role (AWS CLI)

    一,引言 今天额外分享一篇 AWS 的技术内容,需要在 EC2 切换到跨账号 IAM 角色(AWS CLI).假设我们使用两个 AWS 账户,A账号,B账号.我们希望允许 A 账号用于 "i ...

  3. Linux graphics stack

    2D图形架构 早期Linux图形系统的显示全部依赖X Server,X Client调用Xlib提供的借口向 X Server发送渲染命令,X Server根据 X Client的命令请求向硬件设备绘 ...

  4. JDBC 连接池 & Template

    数据库连接池 # 概念:其实就是一个容器(集合),存放数据库连接的容器. * 当系统初始化号以后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容其中获取连接对象,用户访问完之后,会将 ...

  5. 在Fedora中安装PostgreSQL并配置密码和开启远程登陆

    在Fedora中安装PostgreSQL并配置密码 首先先放出官方的文档教程 :https://fedoraproject.org/wiki/PostgreSQL 我写的内容其实也八九不离十,站在一个 ...

  6. 顶级开源项目 Sentry 20.x JS-SDK 设计艺术(Unified API篇)

    SDK 开发 顶级开源项目 Sentry 20.x JS-SDK 设计艺术(理念与设计原则篇) 顶级开源项目 Sentry 20.x JS-SDK 设计艺术(开发基础篇) 顶级开源项目 Sentry ...

  7. 社区 正式发布了 CoreWCF 0.1.0 GA

    CoreWCF 项目在2021.2.19 正式发布了0.1.0 GA版本:https://github.com/CoreWCF/CoreWCF/releases/tag/v0.1.0 ,这个版本号虽然 ...

  8. 事件 on

    $(选择器).on(事件名称,事件的处理函数) 事件名称:js事件去掉on的部分,例如js中onclick,这里就是click 例如:<input type="button" ...

  9. GRU算法原理

    一.GRU算法 GRU(Gate Recurrent Unit,循环门单元)是循环神经网络(Recurrent Neural Network, RNN)的一种.和LSTM(Long-Short Ter ...

  10. MyBatis简单的CRUD操作

    Dao接口 package com.ttpfx.dao; import com.ttpfx.domain.User; import java.util.List; public interface U ...