Oracle官方教程之Fork/Join
fork/join框架是ExecutorService接口的一种具体实现,目的是为了帮助你更好地利用多处理器带来的好处。它是为那些能够被递归地拆解成子任务的工作类型量身设计的。其目的在于能够使用所有可用的运算能力来提升你的应用的性能。
类似于ExecutorService接口的其他实现,fork/join框架会将任务分发给线程池中的工作线程。fork/join框架的独特之处在与它使用工作窃取(work-stealing)算法。完成自己的工作而处于空闲的工作线程能够从其他仍然处于忙碌(busy)状态的工作线程处窃取等待执行的任务。
fork/join框架的核心是ForkJoinPool类,它是对AbstractExecutorService类的扩展。ForkJoinPool实现了工作偷取算法,并可以执行ForkJoinTask任务。
使用fork/join框架的第一步是编写执行一部分工作的代码。你的代码结构看起来应该与下面所示的伪代码类似:
你需要将这段代码包裹在一个ForkJoinTask的子类中。不过,通常情况下会使用一种更为具体的的类型,或者是RecursiveTask(会返回一个结果),或者是RecursiveAction。
当你的ForkJoinTask子类准备好了,创建一个代表所有需要完成工作的对象,然后将其作为参数传递给一个ForkJoinPool实例的invoke()方法即可。
想要了解fork/join框架的基本工作原理,接下来的这个例子会有所帮助。假设你想要模糊一张图片。原始的source图片由一个整数的数组表示,每个整数表示一个像素点的颜色数值。与source图片相同,模糊之后的destination图片也由一个整数数组表示。
对图片的模糊操作是通过对source数组中的每一个像素点进行处理完成的。处理的过程是这样的:将每个像素点的色值取出,与周围像素的色值(红、黄、蓝三个组成部分)放在一起取平均值,得到的结果被放入destination数组。因为一张图片会由一个很大的数组来表示,这个流程会花费一段较长的时间。如果使用fork/join框架来实现这个模糊算法,你就能够借助多处理器系统的并行处理能力。下面是上述算法结合fork/join框架的一种简单实现:
接下来你需要实现父类中的compute()方法,它会直接执行模糊处理,或者将当前的工作拆分成两个更小的任务。数组的长度可以作为一个简单的阀值来判断任务是应该直接完成还是应该被拆分。
如果前面这个方法是在一个RecursiveAction的子类中,那么设置任务在ForkJoinPool中执行就再直观不过了。通常会包含以下一些步骤:
创建一个表示所有需要完成工作的任务。想要浏览完成的源代码,请查看ForkBlur,其中还包含一些创建destination图片文件的额外代码。
除了能够使用fork/join框架来实现能够在多处理系统中被并行执行的定制化算法(如前文中的ForkBlur.java例子),在Java SE中一些比较常用的功能点也已经使用fork/join框架来实现了。在Java SE 8中,java.util.Arrays类的一系列parallelSort()方法就使用了fork/join来实现。这些方法与sort()系列方法很类似,但是通过使用fork/join框架,借助了并发来完成相关工作。在多处理器系统中,对大数组的并行排序会比串行排序更快。这些方法究竟是如何运用fork/join框架并不在本教程的讨论范围内。想要了解更多的信息,请参见Java API文档。
其他采用了fork/join框架的方法还包括java.util.streams包中的一些方法,此包是作为Java SE 8发行版中Project Lambda的一部分。想要了解更多信息,请参见Lambda Expressions一节。
Oracle 左连接(left join) 排序问题 项目环境:linux、tomcat8.5、SSM框架、oracle11g 项目中一个列表查询,使用了左连接(left join),类似这样: select * from A left join B on A.
关于JOIN使用不同类型的字段类型,数据库可能进行隐士转换,MYSQL ORACLE都是如此, 下面使用一个列子来看看,脚本如下: mysql: drop table testjoin1; drop table testjoin2; create tab...
ali清英 方腾飞,花名清英,英文名kiral,并发编程网创始人,支付宝技术专家,《Java并发编程的艺术》作者。
相关文章
- Oracle教程:掌握数据库管理的基础知识(oracle教程)
- 快速上手:Oracle数据库中建表入门教程(oracle建表教程)
- Oracle实现MD5解密的方法(oracle解密md5)
- 解决Oracle数据库报错:一种新方法(oracle数据库报错)
- 成为Oracle认证大师:完全指南.(oracle认证大师教程)
- Oracle触发器的4种类型(oracle触发器类型)
- 简单易懂的Oracle加表教程,助您快速实现数据库扩充(oracle加表)
- Oracle教程:如何设置列的宽度?(设置列的宽度oracle)
- 简易教程:Oracle数据库导入导出操作指南(oracle数据库导出导入)
- 如何在 Oracle 中建立视图:简单易学的教程(oracle建个视图)
- Oracle 关闭教程:轻松学会如何关闭 Oracle 数据库(如何关闭oracle)
- 如何使用批处理启动Oracle数据库(oracle启动批处理)
- 解析Oracle数据库插件的作用和安装方法(oracle数据库插件)
- “入门到精通,一步不少 Oracle数据库学习教程”(oracle数据库学习教程)
- DB2编目与Oracle的比较及应用研究(DB2编目 oracle)
- Oracle数据库交流群初学者学习指南(oracle交流教程)
- 简单认识Oracle云开启新纪元(oracle云简介)
- Oracle操作指南灵活使用参数(oracle使用参数)
- 在Oracle中实现外联查询的技巧(oracle中外联查询)
- Oracle 三种备份方式技术窍门(oracle三种备份方式)
- Oracle CTL 导出及分析实践(oracle ctl导出)
- Oracle AS 排序自然而然的数据组织和管理(oracle as 排序)