Java线程Fork/Join思想及实现

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

这两天看的是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,维护了一个它的数组,用来储存每个任务的,看了一下它的源代码,感觉有点艰难,还是等下次变得更强的时候再研究吧!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sgen.exe: Speed up XmlSerializer's Startup Performance [.NET 2.0, XML Serialization]

Sgen.exe: Speed up XmlSerializers Startup Performance [.NET 2.0, XML Serialization] Written by Allen Lee 1. Why Sgen.exe? 在《Serialize Your Deck with Positron [XML Serialization, XSD, C#]》一文中&#xff0c;我们领略到 XML Serialization 是如何简化我们的 X…

Java线程并发常用工具类使用

这次整理了一些比较常用的线程工具类啦。 CountDownLatch&#xff1a;在一组线程执行完后&#xff0c;才能开始执行调用等待的线程。上片文章提到过junit的测试尽量不要测试线程&#xff0c;如果硬是要可以使用CountDownLatch进行测试 CyclicBarrier&#xff1a;在一组线程中…

三维图形几何变换算法实验_计算机视觉方向简介 | 深度学习视觉三维重建

点击上方“计算机视觉life”&#xff0c;选择“星标”快速获得最新干货作者&#xff1a; Moonsmilehttps://zhuanlan.zhihu.com/p/79628068本文已由作者授权&#xff0c;未经允许&#xff0c;不得二次转载三维重建意义三维重建作为环境感知的关键技术之一&#xff0c;可用于自动…

读《高效程序员的45个习惯——敏捷开发修炼之道》

本书主要用平易的语言讲述了45个有助于提高程序员自身敏捷的习惯&#xff0c;个人感觉这种老外写的书翻译成中文就少了很多意思。 主要的45个习惯是&#xff1a; 做事欲速则不达对事不对人排除万难跟踪变化对团队投资懂得丢弃打破沙锅问到底把握开发节奏让客户做决定让设计指导…

Java线程CAS原子操作

这次分享一些关于原子操作(CAS)的东西. 定义 CAS(Compare And Swap)是CPU的一个指令级别的操作&#xff0c;叫原子操作&#xff0c;原子操作是不可分割的&#xff0c;跟事务差不多&#xff0c;要么全部执行完成&#xff0c;要么不执行&#xff1b; 像这种操作有点类似阻塞锁…

python 导航栏_解析导航栏的url--selnium,beautifulsoup实战

前段时间做ui自动化测试的时候&#xff0c;导航栏菜单始终有点问题&#xff0c;最后只好直接获取到url&#xff0c;然后直接使用driver.get(url)进入页面&#xff1b;包括做压测的时候&#xff0c;比如我要找出所有报表菜单的url&#xff0c;这样不可能手动去一个一个找出来&am…

PNG图片详解

1、PNG图片类型 PNG格式有8位、24位、32位三种&#xff0c;下面是一些术语&#xff1a; 索引透明&#xff1a;类似于GIF&#xff0c;某一像素只有全透和全不透明两种效果Alpha透明&#xff1a;半透明PNG8 8位的PNG最多支持256&#xff08;2的8次方&#xff09;种颜色&#xff0…

Java并发编程之显式锁(Lock)使用

又是一个基于AQS好用的类&#xff0c;看来下次有必要看看AQS了&#xff0c;正好又是放假。 既然叫显式锁&#xff0c;必然也有隐式锁&#xff0c;也就是所谓的synchronzied关键字&#xff0c;它们两者的区别呢在于使用范围&#xff0c;synchronzied关键字的使用范围比Lock要小…

python pychart三维_详解python模块pychartdir安装及导入问题

在迁移别人写好的脚本时&#xff0c;发现pychartdir没有导入&#xff0c;脚本执行报错。以下是报错内容&#xff1a;[modpsLGJF-ZYC5-MMSC-WEB02 ~]$ python /opt/aspire/product/modps/mopps/shell/dayreport_linux.py/etc/host.conf: line 1: bad command nospoof on"Tr…

vim 中Ctags的安装和使用

Ctags是一个用来为源文件中的标识符&#xff08;如变量、函数、类成员、宏定义等&#xff09;创建索引文件的程序。这些tags文件能被编辑器或其它工具用来快速查找定位源代码中的符号&#xff08;tag/symbol&#xff09;&#xff0c;如变量名&#xff0c;函数名等。 Tags文件中…

Java并发编程之AbstractQueuedSynchronizer(AQS)源码解析

自己一个人随便看看源码学习的心得&#xff0c;分享一下啦&#xff0c;不过我觉得还是建议去买本Java并发编程的书来看会比较好点&#xff0c;毕竟个人的理解有限嘛。 独占锁和共享锁 首先先引入这两个锁的概念&#xff1a;独占锁即同一时刻只有一个线程才能获取到锁&#xf…

采集用python还是火车头_我才知道爬虫也可以酱紫--火车采集器

我才知道爬虫还可以这样—火车采集器的使用说在前面额。。。好吧&#xff0c;我这一个三毛钱的屌丝也开始步入实习阶段了&#xff0c;在北京其实也挺好的&#xff0c;虽说压力大&#xff0c;但是今后就业机会也相对而言大一些。好了&#xff0c;说回今天的主题&#xff0c;之前…

mvn 使用中的错误

出现这种错误的时候&#xff1a;mvn Error building POM may not be this projects POM&#xff0c;报的是那个jar 包&#xff0c;就删除那个jar 包&#xff0c;重新mvn clean install .ok

Java并发编程之FutureTask源码解析

上次总结一下AQS的一些相关知识&#xff0c;这次总结了一下FutureTask的东西&#xff0c;相对于AQS来说简单好多呀 之前提到过一个LockSupport的工具类&#xff0c;也了解一下这个工具类的用法&#xff0c;这里也巩固一下吧 /*** Makes available the permit for the given th…

java 删除二维数组中的null_避免在Java中检查Null语句

1.概述通常&#xff0c;在Java代码中处理null变量、引用和集合很棘手。它们不仅难以识别&#xff0c;而且处理起来也很复杂。事实上&#xff0c;在编译时无法识别处理null的任何错误&#xff0c;会导致运行时NullPointerException。在本教程中&#xff0c;我们将了解在Java中检…

Java并发编程之并发容器ConcurrentHashMap(JDK1.7)解析

最近看了一下ConcurrentHashMap的相关代码&#xff0c;感觉JDK1.7和JDK1.8差别挺大的&#xff0c;这次先看下JDK1.7是怎么实现的吧 哈希&#xff08;hash&#xff09; 先了解一下啥是哈希&#xff08;网上有很多介绍&#xff09;&#xff0c;是一种散列函数&#xff0c;简单来…

带控制端的逻辑运算电路_分别完成正整数的平方、立方和阶乘的运算verilog语言...

练习&#xff1a;设计一个带控制端的逻辑运算电路&#xff0c;分别完成正整数的平方、立方和阶乘的运算。 //--------------myfunction---------- modulemyfunction(clk,n,result,reset,sl); output[6:0]result; input[2:0] n; input reset,clk; input [1:0] sl; reg[6:0]resul…

Java并发编程之并发容器ConcurrentHashMap(JDK1.8)解析

这个版本ConcurrentHashMap难度提升了很多&#xff0c;就简单的谈一下常用的方法就好了&#xff0c;可能有些讲的不太清楚&#xff0c;麻烦发现的大佬指正一下 主要数据结构 1.8将Segment取消了&#xff0c;保留了table数组的形式&#xff0c;但是不在以HashEntry纯链表的形式…

simulink显示多个数据_如何在 Simulink 中使用 PID Tuner 进行 PID 调参?

作者 | 安布奇责编 | 胡雪蕊出品 | CSDN(ID: CSDNnews)本文为一篇技术干货&#xff0c;主要讲述在Simulink如何使用PID Tuner进行PID调参。PID调参器( PIDTuner)概述1.1 简介使用PID Tuner可以对Simulink模型中的PID控制器&#xff0c;离散PID控制器&#xff0c;两自由度PID控制…

Java并发编程之堵塞队列介绍以及SkipList(跳表)

堵塞队列 先了解一下生产者消费者模式&#xff1a; 生产者就是生产数据的一方&#xff0c;消费者就是消费数据的另一方。在多线程开发中&#xff0c;如果生产者处理速度很快&#xff0c;而消费者处理速度很慢&#xff0c;那么生产者就必须等待消费者处理完&#xff0c;才能继…