java多线程 -- ForkJoinPool 分支/ 合并框架 工作窃取
Fork/Join 框架:就是在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个的小任务运算的结果进行 join 汇总。
Fork/Join 框架与线程池的区别
- 采用 “工作窃取”模式(work-stealing):当执行新的任务时它可以将其拆分分成更小的任务执行,并将小任务加到线程队列中,然后再从一个随机线程的队列中偷一个并把它放在自己的队列中。
- 相对于一般的线程池实现,fork/join框架的优势体现在对其中包含的任务的处理方式上.在一般的线程池中,如果一个线程正在执行的任务由于某些原因无法继续运行,那么该线程会处于等待状态。而在fork/join框架实现中,如果某个子问题由于等待另外一个子问题的完成而无法继续运行。那么处理该子问题的线程会主动寻找其他尚未运行的子问题来执行.这种方式减少了线程的等待时间,提高了性能。
ForkJoinPool封装类:
- package com.company;
- import java.util.concurrent.Callable;
- import java.util.concurrent.ExecutionException;
- import java.util.concurrent.ForkJoinPool;
- import java.util.concurrent.ForkJoinTask;
- public final class ForkJoinPoolUtils {
- private static final int CPUS_COUNT = Runtime.getRuntime().availableProcessors();
- private ForkJoinPoolUtils(){}
- public static <T> T executeInDedicatedThreadPool(Callable<T> task){
- return executeInDedicatedThreadPool(task, CPUS_COUNT);
- }
- public static <T> T invokeInDedicatedThreadPool(ForkJoinTask<T> task){
- return new ForkJoinPool(CPUS_COUNT).invoke(task);
- }
- public static <T> T executeInDedicatedThreadPool(Callable<T> task, int threadsCount){
- try{
- return new ForkJoinPool(threadsCount).submit(task).get();
- }
- catch( ExecutionException execEx ){
- throw new IllegalStateException(execEx);
- }
- catch(InterruptedException interEx ){
- Thread.currentThread().interrupt();
- throw new IllegalStateException(interEx);
- }
- }
- }
使用forkJoinPool Demo:
- package com.company;
- import java.time.Duration;
- import java.time.Instant;
- import java.util.concurrent.ForkJoinTask;
- import java.util.concurrent.RecursiveTask;
- public class TestForkJoinPool {
- public static void main(String[] args) {
- Instant start = Instant.now();
- ForkJoinTask<Long> task = new ForkJoinSumCalculate(0L, 500000000L);
- Long sum = ForkJoinPoolUtils.invokeInDedicatedThreadPool(task);
- System.out.println(sum);
- Instant end = Instant.now();
- System.out.println("耗费时间为:" + Duration.between(start, end).toMillis());//166-1996-10590
- }
- }
- class ForkJoinSumCalculate extends RecursiveTask<Long> {
- private static final long serialVersionUID = -259195479995561737L;
- private long start;
- private long end;
- private static final long THURSHOLD = 10000L; //临界值
- public ForkJoinSumCalculate(long start, long end) {
- this.start = start;
- this.end = end;
- }
- @Override
- protected Long compute() {
- long length = end - start;
- if (length <= THURSHOLD) {
- long sum = 0L;
- for (long i = start; i <= end; i++) {
- sum += i;
- }
- return sum;
- } else {
- long middle = (start + end) / 2;
- ForkJoinSumCalculate left = new ForkJoinSumCalculate(start, middle);
- left.fork(); //进行拆分,同时压入线程队列
- ForkJoinSumCalculate right = new ForkJoinSumCalculate(middle + 1, end);
- right.fork(); //
- return left.join() + right.join();
- }
- }
- }
结果:
- 125000000250000000
- 耗费时间为:204
java多线程 -- ForkJoinPool 分支/ 合并框架 工作窃取的更多相关文章
- ForkJoinPool分支合并框架-工作窃取
Fork/Join 框架 Fork/Join 框架:就是在必要的情况下,将一个大任务,进行拆分(fork)成 若干个小任务(拆到不可再拆时), 再将一个个的小任务运算的结果进行 join 汇总 For ...
- 11.ForkJoinPool 分支/合并框架 (工作窃取)
/*ForkJoinPool 分支/合并框架 (工作窃取)*/ Fork/Join 框架:就是在必要的情况下,将一个大任务,进行拆分(fork) 成若干个小任务(拆到给出的临界值为止),再将一个个的小 ...
- ForkJoinPool 分支/合并框架
ForkJoinPool 分支/合并框架 一.Fork/Join框架简介 Fork/Join 框架就是在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个的小 ...
- ForkJoinPool分支/合并框架工程使用的工作窃取
ForkJoinPool分支/合并框架 在必要的情况下,讲一个大任务,进行拆分(fork)成若干个小任务(拆到不可拆为止),再将一个个小的任务运算的结果进行join汇总. 工作窃取的背景 分支/合并框 ...
- TortoiseGit- 创建本地新分支,提交推送到远程,本地新分支合并到工作分支,提交到远程工作分支等。
整体思路: 创建本地新分支 (create branch) -- 切换到本地新分支工作 (switch/checkout) --提交修改 (commit) -- 推送到远程新分支 (push) ...
- java多线程系列:Executors框架
目录 Executor接口介绍 ExecutorService常用接口介绍 创建线程池的一些方法介绍 3.1 newFixedThreadPool方法 3.2 newCachedThreadPool方 ...
- JAVA多线程(四) Executor并发框架向RabbitMQ推送消息
github代码地址: https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service ...
- java 多线程 一个博客
http://blog.csdn.net/a352193394/article/category/2563875 Java多线程之~~~线程安全容器的非阻塞容器 在并发编程中,会经常遇到使用容器.但是 ...
- JUC-分支合并框架
一.原理 Fork:把一个复杂任务进行分拆,大事化小 Join:把分拆任务的结果进行合并 ForkJoinPool 分支合并池 类比=> 线程池 ForkJoinTask ForkJo ...
随机推荐
- bootstrap轮播图不能显示左右箭头
引入font文件夹即可 原文 :http://www.imooc.com/qadetail/64277
- 基础业务:滚动到指定位置导航固定(CSS实现)
最近公司做的业务都是使用Vue.Element写的,涉及到的相应的基础业务像轮播.预加载.懒加载,都是使用 NPM上的工具来实现,原理和基础还是要有的,就来实现几个项目中常用到的业务. 经常见到这样的 ...
- UVALive 7464 Robots(模拟)
7464Robots Write a program to collect data from robots. We are given two sets of robotsX=fX1;:::;Xmg ...
- [2019BUAA软工]第0次代码作业
Visual Studio 单元测试的简单应用 写在前面 笔者根据作业的介绍以及Visual Studio 2017 文档的相关说明,进行了Visual Studio 单元测试的简单应用. Tip ...
- Hibernate笔记②--hibernate类生成表、id生成策略、级联设置、继承映射
一.多表的一个关联关系 老师和学生是一对多的关系 student:tid属性 外键约束 对应teacher表中的id属性 teacher:id 在myeclipse的db窗口中选中两个表来生成类. ...
- BNUOJ 52303 Floyd-Warshall Lca+bfs最短路
题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52303 Floyd-Warshall Time Limit: 60000msMemory L ...
- 第一次spring冲刺第8天
针对这几天出现的问题,我们团队做了用户需求讨论. 1.客户类型:工作者为主,其他类型都适用的计算器软件 2.需求与满足:他们想要的是能使用简单,并且适用于工作上 3.满足度:最好后台可以提供意见反馈, ...
- git学习-综合性文章
文章:[转载]理解 Git 分支管理最佳实践 首先介绍了git各种分支:
- IHttpModule理解-知识补充
文章:IHttpModule的那些事 可以自定义类实现IHttpModule接口,然后实现接口方法Init,Init方法可以得到HttpApplication 的实例化对象. 然后给对象的事件的注册各 ...
- 关于mybatis的思考(2)——mybatis映射文件的深入理解
1.配置文件 mybatis进行持久化操作是以SqlSessionFactory对象为基础的,这个对象是整个数据库映射关系经过编译后的内存镜像. InputStream inputStream = R ...