博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Fork/Join 框架
阅读量:4170 次
发布时间:2019-05-26

本文共 700 字,大约阅读时间需要 2 分钟。

Fork/Join 框架是 JDK 1.7 提供的一个用于并行执行任务的框架,其核心理念是把一个大任务分割成若干个小任务进行窃取执行,然后最终汇总每个小任务结果后得到大任务结果的并发框架。Fork 就是把一个大任务切分为若干子任务进行并行执行,Join 就是合并这些子任务的最终执行结果得到这个大任务的结果。

Fork/Join 框架采用了工作窃取(work-stealing)算法来实现,其算法核心是指某个线程从其他队列里窃取任务来执行。因为当我们需要处理一个大任务时,我们会把这个大任务分割为若干互不依赖的子任务,为了减少线程间的竞争,我们会把这些子任务分别放到不同的队列里,然后为每个队列创建一个单独的线程来执行队列里的任务,线程和队列一一对应。但是假设此时 A 线程已经把自己 A 队列里的所有子任务执行完毕,而 B 线程还没将对应的 B 队列里子任务执行完毕,此时已执行完毕自己队列全部子任务的线程 A 与其等着 B 进行合并,还不如去帮 B 线程干活,所以 A 线程就会去 B 线程的队列里窃取一个子任务来执行。在窃取操作中由于 A B 线程会同时访问 B 线程对应的子任务队列,所以为了减少窃取任务的线程 A 和被窃取任务线程 B 之间的竞争,通常会使用双端队列,被窃取任务线程 B 永远从双端队列的头部拿任务执行,而窃取任务的线程 A 永远从双端队列的尾部拿任务执行。

通过这种算法就可以充分利用线程进行并行操作,同时减少了线程间的竞争。但缺点就是在某些情况下还是存在竞争(双端队列里只有一个任务时)且消耗了更多的系统资源(创建多个线程和多个双端队列),可以说是一种空间换时间的优化。

转载地址:http://cvbai.baihongyu.com/

你可能感兴趣的文章
Ubuntu安装Anaconda
查看>>
蓝桥杯特别数的和(编程大题)
查看>>
Linux系统卡死,只有鼠标能动,解决办法
查看>>
三通道图像和四通道图像
查看>>
win10系统调出计算机和网络图标
查看>>
C/C++中字符串操作函数strcpy,strcat,strlen等
查看>>
贝壳找房机试题(笔试题)
查看>>
Xerces的下载,编译和在VS 2019中的配置
查看>>
国内快速访问GitHub的方法,亲测有用
查看>>
键盘fn键常亮(一直亮),解决办法
查看>>
Xerces C++实现xml文件解析
查看>>
用户强制一台设备登录,其他设备登出
查看>>
spring实现单例及创建线程安全单例
查看>>
设计模式-- 模板方法模式
查看>>
SQL关键字执行顺序
查看>>
设计模式--适配器模式
查看>>
SpringMvc注解之@ControllerAdvice
查看>>
SQL--查询两个字段相同的记录
查看>>
多研究些架构,少谈些框架(1) -- 论微服务架构的核心概念
查看>>
多研究些架构,少谈些框架(2)-- 微服务和充血模型
查看>>