最近在看线程这一块的东西,所以之前的那篇文章就是用来记录的,但看起来好简单的样子,哈哈哈!

这两天看的是Fork/Join 分而治之的思想,Doug Lea大师的JUC还是挺强的,学并发编程应该没有人不知道这个大佬吧!

上篇少记录了一个东西,叫守护线程,即Thread.setDaemon(boolean on);当参数为false的时候,没有意思,当参数为true的时候,即调用该方法的线程与当前的线程共生死,就是当前线程结束了后无论调用setDeamon(true)的线程是否结束,它都会结束;这个这么看起来虽然用处不大,但是在使用单元测试的时候,即junit测试,使用@Test进行测试线程时,当测试线程走完后,调用的线程都会结束,就是因为守护线程的存在,导致会出现这样的现象;所以在测试线程的时候尽量不要使用junit单元测试,还是使用main方法测试比较好。

现在开始谈谈Fork/Join啦,分而治之,就是将一个大任务拆分到多个小任务,然后小任务同时执行,执行完后将每个小任务运算结果进行合并,这样能够加快程序运行的速度。像这种分而治之的思想在归并排序算法中能体现出来。

Fork/Join的使用标准范式:

ForkJoinPool pool = new ForkJoinPool();
ForkJoinTask task = new ForkJoinTask();
pool.invoke(task);
Result = task.join();

ForkJoinPool其实是个线程池继承自JDK的线程池ExecutorService,说白就是多线程执行多个任务,然后将结果进行合并预算,来提升程序的运行的速度

ForkJoinTask主要有两个常用的实现类RecursiveAction以及RecursiveTask<T> 即一个是同步带有返回值的,后面那个异步不带有返回值的

RecursiveTask<T>的使用示例:

class UseRecursiveTask extends RecursiveTask<T> {protected T compute(){//do something...UseRecursiveTask task1 = new UseRecursiveTask();UseRecursiveTask task2 = new UseRecursiveTask();invokeAll(task1,task2);//再次调用task1和task2的compute()方法return task1.join() + task2.join();//阻塞并等待获取结果值}
}
//主方法
public static void main(String [] arg0){ForkJoinPool pool = new ForkJoinPool();UseRecursiveTask task = new UseRecursiveTask<T>();pool.invoke(task);T result = task.join();//开始执行,进入阻塞,等待拆分任务全部执行。//do something...
}

RecursiveAction的使用示例:

class UseRecursiveAction extends RecursiveAction {protected void compute(){//do something...UseRecursiveAction action1 = new UseRecursiveAction();UseRecursiveAction action2 = new UseRecursiveAction();List<UseRecursiveAction> list = new ArrayList<UseRecursiveAction>();list.add(action1);list.add(action2);Collection<UseRecursiveAction> collection = invokeAll(list);for(UseRecursiveAction action : collection){action.join();//异步执行}}
}
//主线程
public static void main(String [] arg0){ForkJoinPool pool = new ForkJoinPool();UseRecursiveAction action = new UseRecursiveAction();pool.execute(action);//开始异步执行//这里可执行其他业务逻辑//....action.join();//进入阻塞状态,等待异步线程执行完毕
}

上面就是两种示例,在Fork/Join中其实还有一种思想叫工作密取(Worker-Stealing),就是空闲的线程会从繁忙线程的任务队列中,从任务队列后面获取一个任务去执行,在ForkJoinPool 中就已经实现好了。

既然谈到了这个,就简单的看了一下源代码,在ForkJoinPool 类中有个内部类叫WorkQueue,维护了一个它的数组,用来储存每个任务的,看了一下它的源代码,感觉有点艰难,还是等下次变得更强的时候再研究吧!

Java线程Fork/Join思想及实现相关推荐

  1. System Verilog线程——fork join的理解使用

    本文参考绿皮书第七章,线程及其线程间的通信,Verilog HDL A guide to digital design and synthesis 2nd第七章.主要对于begin-end,fork- ...

  2. java fork_浅谈Java的Fork/Join并发框架

    前几天有写到整合并发结果的文章,于是联想到了Fork/Join.因为在我看来整合并发结果其实就是Fork/Join中的Join步骤.所以今天我就把自己对Fork/Join一些浅显的理解记录下来. 1. ...

  3. 浅谈Java的Fork/Join并发框架

    1. Fork/Join是什么 Oracle的官方给出的定义是:Fork/Join框架是一个实现了ExecutorService接口的多线程处理器.它可以把一个大的任务划分为若干个小的任务并发执行,充 ...

  4. Java并发-Fork/Join框架

    参考博客:https://www.infoq.cn/article/fork-join-introduction 1. 什么是 Fork/Join 框架 Fork/Join 框架是 Java7 提供了 ...

  5. java forkjoin 简书_浅谈Java的Fork/Join并发框架

    1. Fork/Join是什么 Oracle的官方给出的定义是:Fork/Join框架是一个实现了ExecutorService接口的多线程处理器.它可以把一个大的任务划分为若干个小的任务并发执行,充 ...

  6. java 线程方法join的简单总结

    虽然关于讨论线程join方法的博客已经很多了,不过个人感觉挺多都讨论得不够全面,所以我觉得有必要对其进行一个全面的总结. 一.作用 Thread类中的join方法的主要作用就是同步,它可以使得线程之间 ...

  7. java线程中join方法的简单讲解

    一.作用 Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并发执行变为串行执行.具体看代码: public class Test {public static void main ...

  8. Java并发编程(07):Fork/Join框架机制详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.Fork/Join框架 Java提供Fork/Join框架用于并行执行任务,核心的思想就是将一个大任务切分成多个小任务,然后汇总每个小任务 ...

  9. Fork\Join分而治之--RecursiveTask和RecursiveAction(一)

    fork/join 分而治之 1.什么是Fork/join框架? 从JDK1.7开始,Java提供Fork/Join框架用于并行执行任务.它的思想就是讲一个大任务分割成若干小任务,最终汇总每个小任务的 ...

最新文章

  1. python机械臂api_使用高斯机械臂的API开发
  2. Windows Phone 7第一次亲密接触
  3. python跟java-还在纠结选Python还是Java?看完就有数了
  4. BZOJ 1859 Luogu P2589 [ZJOI2006]碗的叠放 (计算几何)
  5. Java常见异常处理
  6. 面向对象的写法,见到就添,持续更新。。。
  7. clock_gettime系统调用详解
  8. 九度OJ-1525 子串逆序打印
  9. Confluence 6 数据收集隐私策略
  10. 51nod 1060 最复杂的数
  11. linux下rfkill命令管理蓝牙和wifi
  12. 解决模拟人生3(SIM 3)闪退问题
  13. [HNOI2019]鱼
  14. python批量读取文件内容_Python从数据库读取大量数据批量写入文件的方法
  15. 编写程序,输入两个集合 setA 和 setB,分别输出它们的交集、并集和差集 setA-setB
  16. 基于C语言的网络编程的项目
  17. 微服务架构的使用场景
  18. VS提示:已引发异常
  19. Mountain Duck for Mac(云存储空间管理软件) v2.6.7永久破解版
  20. 超详细解析托管与非托管

热门文章

  1. html怎么播放下一首,javascript – HTML5音频播放列表 – 第一个结束后如何播放第二个音频文件?...
  2. linux多线程九宫格,项目实战:Qt九宫格图片资源浏览器(支持window、linux、兼容各国产系统,支持子文件夹,多选,全选,图片预览,行数与列数设置等)...
  3. MySQL 数据库图形化管理界面应用种草之 Navicat Premium 如何使用
  4. mysql 备份 一张表_mysql 备份表的一个方法
  5. 蓝牙耳机声音一顿一顿的_线控耳机党阵地转移成功,OPPO这款TWS耳机体验满分...
  6. 华为云大数据存储的冗余方式是三副本_华为TaurusDB技术解读(转载)
  7. jenkins vue 打包特别慢_从零开始 使用VUE开发桌面客户端
  8. 阿里云rds for mysql平台介绍_阿里云RDS for MySQL 快速入门——笔记
  9. 高斯拟合 vc++代码_NMA2020W1 极大似然法模型拟合与bootstrap
  10. cad求和插件_黑科技 | 无BIM建模下平面CAD自动生成门窗表