倚楼听风雨
淡看江湖路

浅析Java中的Fork和Join并发编程框架

Fork/Join框架是Java7提供了的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务(工作窃取算法),最终汇总每个小任务结果后得到大任务结果的框架。

  • Fork: 把一个大任务分成若干个子任务进行执行,设置一个阀值,判断任务数量,如果超越阀值,无线分割下去
  • Join: 合并子任务获得最终结果

举例: 1+2+3+...+9999+10000,通过Fork将其分成10分,每份计算1000个数的加法运算。

Java Jdk中Fork Join框架流程图

关于工作窃取算法:

简单的来讲,工作窃取算法就是将一个大任务切分成若干份小任务,每个任务放入到不同的队列当中,每个队列有一个相应的工作线程来执行这些任务,当这些线程执行完当前的任务,线程闲置,为了提高效率以及避免浪费资源,利用这些线程窃取其他队列中的任务来执行已达到高效的目的。

队列一般设置成双端队列: 当前队列中的线程从队列的首端获取任务执行,而窃取的线程从队列的尾端获取任务执行,这种方式也有缺点,当队列中只有一个任务的时候,会造成资源竞争以及创建多个双端队列

Fork Join框架中两个主要的类

  1. ForkJoinTask: 创建forkjoin任务,此类在任务中执行fork和join操作的机制,通常继承他的两个子类: RecursiveAction(没有返回结果)、RecursiveTask(有返回结果)
  2. ForkJoinPool: 任务需要通过此类来执行,任务分割出来的子任务会添加到当前的工作线程所维护的双端队列中,进入队列的头部。 当一个工作线程的队列里暂时没有任务时,他会随机从其他工作线程的队列的尾部获取任务

Fork Join框架的优势(为什么要使用Fork/Join框架?)

  • 多核处理器的执行效率,高效利用多核平台硬件
  • 普通的多线程相对复杂
  • 避免死锁(死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程)

一个简单的Fork/Join使用示例(使用fork/join计算1+2+3+4+5+6):

老四的目前所在公司的业务中也经常使用Fork/Join框架,不过是在JDK提供的原基础之上加以改动和封装了一点点。下面的例子是配合适配器设计模式来生成大量优惠券码,关于适配器模式可以参考老四的《浅析设计模式第十七章之适配器模式》这篇文章。

首先,创建fork接口:

实现接口从而实现计算过程:

封装工具类,调用BaseListParamMethod

优惠券生成入库

以上代码仅供思路参考。 其实关于Java中的Fork Join框架还有很多高深的知识点需要我们理解,这里老四推荐ifeve.com的fork标签,里面提供了的很多优秀的译文和文章深度解读fork/join框架,传送门:

更博不易,如果觉得文章对你有帮助并且有能力的老铁烦请赞助盒烟钱,点我去赞助。或者扫描文章下面的微信/支付宝二维码打赏任意金额,老四这里抱拳了。赞助时请备注姓名或者昵称,因为您的署名会出现在赞赏列表页面,您的赞赏钱财也会被用于小站的服务器运维上面,再次抱拳。

赞(20) 给你买杜蕾斯
本站原创文章受自媒体平台原创保护,未经允许不得转载高老四博客 » 浅析Java中的Fork和Join并发编程框架
分享到: 更多 (0)

开始你的表演 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下老四,鼓励我更好的创作

支付宝扫一扫打赏

微信扫一扫打赏