介绍一下 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相关推荐

  1. java中ThreadPool的介绍和使用

    文章目录 Thread Pool简介 Executors, Executor 和 ExecutorService ThreadPoolExecutor ScheduledThreadPoolExecu ...

  2. scheduledexecutorservice 的使用_java中ThreadPool的介绍和使用

    Thread Pool简介 在Java中,threads是和系统的threads相对应的,用来处理一系列的系统资源.不管在windows和linux下面,能开启的线程个数都是有限的,如果你在java程 ...

  3. ForkJoinPool的使用及基本原理

    目录 1.ForkJoinPool是什么 1.1 分治法 1.2 工作窃取(work-stealing,中文又译作偷工减料,也有道理) 2.简单使用 2.1 不带返回值的计算 2.2 带返回值的计算 ...

  4. 深入浅出parallelStream

    about Stream 什么是流? Stream是java8中新增加的一个特性,被Java猿统称为流. Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版 ...

  5. JUC组件扩展(二)-JAVA并行框架Fork/Join(四):监控Fork/Join池

    Fork/Join 框架是为了解决可以使用 divide 和 conquer 技术,使用 fork() 和 join() 操作把任务分成小块的问题而设计的.主要实现这个行为的是 ForkJoinPoo ...

  6. 深入浅出Stream和parallelStream

    转载自:https://blog.csdn.net/darrensty/article/details/79283146 深入浅出parallelStream 什么是流? Stream是java8中新 ...

  7. 了解Java8中的parallelStream

    about Stream 什么是流? Stream是java8中新增加的一个特性,被java猿统称为流. Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版 ...

  8. 聊聊并发编程的12种业务场景

    前言 并发编程是一项非常重要的技术,无论在面试,还是工作中出现的频率非常高. 并发编程说白了就是多线程编程,但多线程一定比单线程效率更高? 答:不一定,要看具体业务场景. 毕竟如果使用了多线程,那么线 ...

  9. Java 并发在项目中的使用场景

    1.并发编程的三个核心问题: (1)分工:所谓分工指的是如何高效地拆解任务并分配给线程 (2)同步:而同步指的是线程之间如何协作 (3)互斥:互斥则是保证同一时刻只允许一个线程访问共享资源 (4)应用 ...

最新文章

  1. jsoncpp空数组
  2. linux搭建宝塔重启mysql_宝塔面板安装 重启等命令linux系统重启
  3. HBuilder X格式化美化代码快捷键
  4. Java培训教程之使用Jsoup实现简单的爬虫技术
  5. python with用法
  6. 前端经典面试题之CSS实现三栏布局,左右宽度固定,中间宽度自适应
  7. 最优化理论与方法(part4)--秩一校正
  8. 面试题_分层遍历二叉树
  9. 在10000以内判断一个整数,它加上100和加上268后都是一个完全平方数 3 提问:请问该数是多少?...
  10. Android_自适应布局
  11. 我的世界检测不到java_《我的世界》检测不到java怎么办?
  12. php mysql手册下载chm_PHP7教程|PHP7中文手册下载chm版 - 欧普软件下载
  13. 美国诚实签经验——回答签证官的问题时,一定要问什么才答什么,不要犹豫改口、做很多解释或开玩笑,自信且镇静地与他对话,着装得体、举止自然、言谈自信...
  14. ubuntu 22端口不通
  15. Sublime 如何替换换行符
  16. 种类并查集(POJ1703)
  17. linux下启动nginx报错libpcre.so.0 = not found
  18. matlab求解多自由度振动系统,【2017年整理】1-《机械振动基础》大作业,基于matlab的多自由度振动.doc...
  19. zlib流压缩--字符串
  20. tslint pre-commit 配置教程

热门文章

  1. CODEVS 2491 玉蟾宫
  2. PMP备考大全:经典题库(敏捷管理第9期)
  3. GetLastError() 返回值对照表
  4. (MySQL)Incorrect string value: '\xF0\x9F\x98\x82\xF0\x9F...' for column 'readerName' at row 1
  5. FPGA学习笔记(七): DSB调制解调的仿真
  6. FPGA结构分析——IDELAY2,网口储备点3
  7. 在word中在方框里打钩
  8. 音视频入门系列-音视频基础知识篇(录播、点播、直播)
  9. 解决ubuntu无法解析域名问题
  10. PS证件照红底转蓝底