介绍一下 ForkJoinPool
介绍一下 ForkJoinPool
ForkJoinPool 是 JDK1.7 开始提供的线程池。为了解决 CPU 负载不均衡的问题。如某个较大的任务,被一个线程去执行,而其他线程处于空闲状态。
ForkJoinTask 表示一个任务,ForkJoinTask 的子类中有 RecursiveAction 和 RecursiveTask。
RecursiveAction 无返回结果;RecursiveTask 有返回结果。
重写 RecursiveAction 或 RecursiveTask 的 compute(),完成计算或者可以进行任务拆分。
调用 ForkJoinTask 的 fork() 的方法,可以让其他空闲的线程执行这个 ForkJoinTask;
调用 ForkJoinTask 的 join() 的方法,将多个小任务的结果进行汇总。
无返回值打印任务拆分
package constxiong.interview;import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
import java.util.concurrent.TimeUnit;/*** 测试 ForkJoinPool 线程池的使用* @author ConstXiong* @date 2019-06-12 12:05:55*/
public class TestForkJoinPool {public static void main(String[] args) throws Exception {testNoResultTask();//测试使用 ForkJoinPool 无返回值的任务执行}/*** 测试使用 ForkJoinPool 无返回值的任务执行* @throws Exception*/public static void testNoResultTask() throws Exception {ForkJoinPool pool = new ForkJoinPool();pool.submit(new PrintTask(1, 200));pool.awaitTermination(2, TimeUnit.SECONDS);pool.shutdown();}
}/*** 无返回值的打印任务* @author ConstXiong* @date 2019-06-12 12:07:02*/
class PrintTask extends RecursiveAction {private static final long serialVersionUID = 1L;private static final int THRESHOLD = 49;private int start;private int end;public PrintTask(int start, int end) {super();this.start = start;this.end = end;}@Overrideprotected void compute() {//当结束值比起始值 大于 49 时,按数值区间平均拆分为两个任务;否则直接打印该区间的值if (end - start < THRESHOLD) {for (int i = start; i <= end; i++) {System.out.println(Thread.currentThread().getName() + ", i = " + i);}} else {int middle = (start + end) / 2;PrintTask firstTask = new PrintTask(start, middle);PrintTask secondTask = new PrintTask(middle + 1, end);firstTask.fork();secondTask.fork();}}}
有返回值计算任务拆分、结果合并
package constxiong.interview;import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
import java.util.concurrent.TimeUnit;/*** 测试 ForkJoinPool 线程池的使用* @author ConstXiong* @date 2019-06-12 12:05:55*/
public class TestForkJoinPool {public static void main(String[] args) throws Exception {testHasResultTask();//测试使用 ForkJoinPool 有返回值的任务执行,对结果进行合并。计算 1 到 200 的累加和}/*** 测试使用 ForkJoinPool 有返回值的任务执行,对结果进行合并。计算 1 到 200 的累加和* @throws Exception*/public static void testHasResultTask() throws Exception {int result1 = 0;for (int i = 1; i <= 200; i++) {result1 += i;}System.out.println("循环计算 1-200 累加值:" + result1);ForkJoinPool pool = new ForkJoinPool();ForkJoinTask<Integer> task = pool.submit(new CalculateTask(1, 200));int result2 = task.get();System.out.println("并行计算 1-200 累加值:" + result2);pool.awaitTermination(2, TimeUnit.SECONDS);pool.shutdown();}}/*** 有返回值的计算任务* @author ConstXiong* @date 2019-06-12 12:07:25*/
class CalculateTask extends RecursiveTask<Integer> {private static final long serialVersionUID = 1L;private static final int THRESHOLD = 49;private int start;private int end;public CalculateTask(int start, int end) {super();this.start = start;this.end = end;}@Overrideprotected Integer compute() {//当结束值比起始值 大于 49 时,按数值区间平均拆分为两个任务,进行两个任务的累加值汇总;否则直接计算累加值if (end - start <= THRESHOLD) {int result = 0;for (int i = start; i <= end; i++) {result += i;}return result;} else {int middle = (start + end) / 2;CalculateTask firstTask = new CalculateTask(start, middle);CalculateTask secondTask = new CalculateTask(middle + 1, end);firstTask.fork();secondTask.fork();return firstTask.join() + secondTask.join();}}}
【Java面试题与答案】整理推荐
- 基础与语法
- 集合
- 网络编程
- 并发编程
- Web
- 安全
- 设计模式
- 框架
- 算法与数据结构
- 异常
- 文件解析与生成
- Linux
- MySQL
- Oracle
- Redis
- Dubbo
介绍一下 ForkJoinPool相关推荐
- java中ThreadPool的介绍和使用
文章目录 Thread Pool简介 Executors, Executor 和 ExecutorService ThreadPoolExecutor ScheduledThreadPoolExecu ...
- scheduledexecutorservice 的使用_java中ThreadPool的介绍和使用
Thread Pool简介 在Java中,threads是和系统的threads相对应的,用来处理一系列的系统资源.不管在windows和linux下面,能开启的线程个数都是有限的,如果你在java程 ...
- ForkJoinPool的使用及基本原理
目录 1.ForkJoinPool是什么 1.1 分治法 1.2 工作窃取(work-stealing,中文又译作偷工减料,也有道理) 2.简单使用 2.1 不带返回值的计算 2.2 带返回值的计算 ...
- 深入浅出parallelStream
about Stream 什么是流? Stream是java8中新增加的一个特性,被Java猿统称为流. Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版 ...
- JUC组件扩展(二)-JAVA并行框架Fork/Join(四):监控Fork/Join池
Fork/Join 框架是为了解决可以使用 divide 和 conquer 技术,使用 fork() 和 join() 操作把任务分成小块的问题而设计的.主要实现这个行为的是 ForkJoinPoo ...
- 深入浅出Stream和parallelStream
转载自:https://blog.csdn.net/darrensty/article/details/79283146 深入浅出parallelStream 什么是流? Stream是java8中新 ...
- 了解Java8中的parallelStream
about Stream 什么是流? Stream是java8中新增加的一个特性,被java猿统称为流. Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版 ...
- 聊聊并发编程的12种业务场景
前言 并发编程是一项非常重要的技术,无论在面试,还是工作中出现的频率非常高. 并发编程说白了就是多线程编程,但多线程一定比单线程效率更高? 答:不一定,要看具体业务场景. 毕竟如果使用了多线程,那么线 ...
- Java 并发在项目中的使用场景
1.并发编程的三个核心问题: (1)分工:所谓分工指的是如何高效地拆解任务并分配给线程 (2)同步:而同步指的是线程之间如何协作 (3)互斥:互斥则是保证同一时刻只允许一个线程访问共享资源 (4)应用 ...
最新文章
- jsoncpp空数组
- linux搭建宝塔重启mysql_宝塔面板安装 重启等命令linux系统重启
- HBuilder X格式化美化代码快捷键
- Java培训教程之使用Jsoup实现简单的爬虫技术
- python with用法
- 前端经典面试题之CSS实现三栏布局,左右宽度固定,中间宽度自适应
- 最优化理论与方法(part4)--秩一校正
- 面试题_分层遍历二叉树
- 在10000以内判断一个整数,它加上100和加上268后都是一个完全平方数 3 提问:请问该数是多少?...
- Android_自适应布局
- 我的世界检测不到java_《我的世界》检测不到java怎么办?
- php mysql手册下载chm_PHP7教程|PHP7中文手册下载chm版 - 欧普软件下载
- 美国诚实签经验——回答签证官的问题时,一定要问什么才答什么,不要犹豫改口、做很多解释或开玩笑,自信且镇静地与他对话,着装得体、举止自然、言谈自信...
- ubuntu 22端口不通
- Sublime 如何替换换行符
- 种类并查集(POJ1703)
- linux下启动nginx报错libpcre.so.0 = not found
- matlab求解多自由度振动系统,【2017年整理】1-《机械振动基础》大作业,基于matlab的多自由度振动.doc...
- zlib流压缩--字符串
- tslint pre-commit 配置教程
热门文章
- CODEVS 2491 玉蟾宫
- PMP备考大全:经典题库(敏捷管理第9期)
- GetLastError() 返回值对照表
- (MySQL)Incorrect string value: '\xF0\x9F\x98\x82\xF0\x9F...' for column 'readerName' at row 1
- FPGA学习笔记(七): DSB调制解调的仿真
- FPGA结构分析——IDELAY2,网口储备点3
- 在word中在方框里打钩
- 音视频入门系列-音视频基础知识篇(录播、点播、直播)
- 解决ubuntu无法解析域名问题
- PS证件照红底转蓝底