文章目录

  • 一、ForkJoin是什么?它能用来实现什么功能?
  • 二、ForkJoin的实现原理
  • 三、ForkJoin的简单使用

一、ForkJoin是什么?它能用来实现什么功能?

ForkJoin也是一种线程池,只不过ForkJoin是专为CPU密集型任务而建立的线程池,它能大大提高CPU密集型任务的执行效率。

二、ForkJoin的实现原理

ForkJoin是使用分治算法实现的,主要的原理就是将一个大的任务拆分为若干个小任务分发给若干个线程去处理,最后将若干的线程处理好后的结果进行汇总,从而达到提升计算效率的结果。
ForkJoin内部含有工作窃取逻辑:如果一个线程完成了本身所关联的工作队列中的人物,那么它会尝试从其它的工作队列中窃取任务来执行(窃取任务的位置是双端队列base端,工作线程一般都是从top端获取任务),从而提升了线程的使用率

三、ForkJoin的简单使用

package com.muyichen.demo.forkjoin;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;
import java.util.concurrent.RecursiveTask;@Slf4j
public class ForkJoinExample extends RecursiveTask<Integer> {public static final int threshold = 2;private int start;private int end;public ForkJoinExample(int start, int end) {this.start = start;this.end = end;}@Overrideprotected Integer compute() {int sum = 0;//如果任务足够小就计算任务boolean canCompute = (end - start) <= threshold;if (canCompute) {for (int i = start; i <= end; i++) {sum += i;}} else {// 如果任务大于阈值,就分裂成两个子任务计算int middle = (start + end) / 2;ForkJoinExample leftTask = new ForkJoinExample(start, middle);ForkJoinExample rightTask = new ForkJoinExample(middle + 1, end);// 执行子任务leftTask.fork();rightTask.fork();// 等待任务执行结束合并其结果int leftResult = leftTask.join();int rightResult = rightTask.join();// 合并子任务sum = leftResult + rightResult;}return sum;}public static void main(String[] args) {ForkJoinPool forkjoinPool = new ForkJoinPool();//生成一个计算任务,计算1加到100ForkJoinExample task = new ForkJoinExample(1, 100);//执行一个任务Future<Integer> result = forkjoinPool.submit(task);try {log.info("result:{}", result.get());} catch (Exception e) {log.error("exception", e);}}}

浅谈ForkJoin相关推荐

  1. 浅谈Java锁,与JUC的常用类,集合安全类,常用辅助类,读写锁,阻塞队列,线程池,ForkJoin,volatile,单例模式不安全,CAS,各种锁

    浅谈JUC的常用类 JUC就是java.util.concurrent-包下的类 回顾多线程 Java默认有几个线程? 2 个 mian.GC Java 真的可以开启线程吗? 开不了,点击源码得知:本 ...

  2. 浅谈MySQL存储引擎-InnoDBMyISAM

    浅谈MySQL存储引擎-InnoDB&MyISAM 存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取.MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式 ...

  3. 【大话设计模式】——浅谈设计模式基础

    初学设计模式给我最大的感受是:人类真是伟大啊!单单是设计模式的基础课程就让我感受到了强烈的生活气息. 个人感觉<大话设计模式>这本书写的真好.让貌似非常晦涩难懂的设计模式变的生活化.趣味化 ...

  4. 学校计算机机房好处,浅谈学校计算机机房维护

    浅谈学校计算机机房维护    现在的学校机房都配置了数量较多的计算机,而且机房的使用非常频繁.对于怎样维护好计算机,特别是计算机软件系统,对广大计算机教师来说是一个很重要且非常现实的问题.下面就本人在 ...

  5. java 中的单元测试_浅谈Java 中的单元测试

    单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...

  6. mybatis与php,浅谈mybatis中的#和$的区别

    浅谈mybatis中的#和$的区别 发布于 2016-07-30 11:14:47 | 236 次阅读 | 评论: 0 | 来源: 网友投递 MyBatis 基于Java的持久层框架MyBatis 本 ...

  7. 浅谈GCC预编译头技术

    浅谈GCC预编译头技术 文/jorge --谨以此文,悼念我等待MinGW编译时逝去的那些时间. 其 实刚开始编程的时候,我是丝毫不重视编译速度之类的问题的,原因很简单,因为那时我用BASICA.后来 ...

  8. 【笔记】震惊!世上最接地气的字符串浅谈(HASH+KMP)

    震惊!世上最接地气的字符串浅谈(HASH+KMP) 笔者过于垃圾,肯定会有些错的地方,欢迎各位巨佬指正,感激不尽! 引用:LYD的蓝书,一本通,DFC的讲稿,网上各路巨佬 Luguo id: 章鱼那个 ...

  9. 浅谈几种区块链网络攻击以及防御方案之其它网络攻击

    旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/16/network_attack_of_blockchain_other_attack/ 写在前面的话 自比特 ...

最新文章

  1. Delphi中Indy 10的安装和老版本的卸载
  2. 超可爱 纯CSS3实现的小猪、小老鼠、小牛
  3. Win7与其它Windows的双系统问题
  4. python 单线程_python的单线程多任务的实现
  5. 使用React和Spring Boot构建一个简单的CRUD应用
  6. CDH5.14.0 安装失败,无法接受agent发出的检测信号
  7. 77个互联网+大学生创新创业大赛文档
  8. SQL Server 2019重新安装失败的处理方法
  9. 兵以诈立 —— 三国的谋略
  10. 10个最好的免费FTP客户端
  11. windows系统清理垃圾文件
  12. 广东外语外贸大学教务系统一键查分
  13. 青岛大学计算机考研率高吗,学院2015届毕业生考研率再创新高
  14. Android Killer中apktool插件更新
  15. 带货直播源码,浅谈直播实现过程和技术
  16. 三极管工作原理--我见过最通俗讲法
  17. 【产品集】什么是堡垒机?为什么需要堡垒机
  18. 分享一个600块钱的Python私活单,金融Excel数据清洗
  19. mac 安装node.js
  20. 【转载】FCKeditor 2.6.3 与FCKeditor.java 2.4在JSP中配置

热门文章

  1. 如何进入linux基本目录,Linux入门的一些基本知识整理
  2. 分享115个HTML动植食物模板,总有一款适合您
  3. HTML学生个人网站作业设计:基于HTML+CSS+JavaScript设计多用途的图文展示博客HTML模板(16页)
  4. photoshop简单教程
  5. 广东企业电子申报管理系统——官方软件下载
  6. [附源码]java毕业设计大学生心理咨询网站
  7. java控制台打印各种图形
  8. BOOTPROTO=none|bootp|dhcp|static
  9. Tokitsukaze and Good 01-String (easy version)
  10. Spring声明式事务管理实现及原理详解