fork/join框架Java

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

Fork/Join使用两个类:

  • ForkJoinTask:我们要使用ForkJoin框架,必须首先创建一个ForkJoin任务。它提供在任务中执行fork()和join()操作的机制,ork/Join框架提供了以下两个子类:
    • RecursiveAction:用于没有返回结果的任务。
    • RecursiveTask :用于有返回结果的任务。
  • ForkJoinPool :ForkJoinTask需要通过ForkJoinPool来执行,任务分割出的子任务会添加到当前工作线程所维护的双端队列中。

ForkJoinPool是一个执行ForkJoinTask的ExecutorService,ForkJoinPool提供no-ForkJoinTask客户端提交的入口点,以及管理和监视操作。

ForkJoinPool与其他类型的ExecutorService的不同之处主要在于使用工作窃取:池中的所有线程都尝试查找和执行提交给池的任务和/或由其他活动任务创建的任务(如果不存在则最终阻止等待工作)。当大多数任务产生其他子任务时(如大多数ForkJoinTasks),以及从外部客户端向池提交许多小任务时,这可以实现高效处理。特别是在构造函数中将asyncMode设置为true时,ForkJoinPools也可能适用于从未加入的事件样式任务。

static commonPool()适用于大多数应用程序,common pool由未显式提交到指定池的任何ForkJoinTask使用。使用common pool通常会减少资源使用(其线程在不使用期间缓慢回收,并在后续使用时恢复)。

然后我们写一个demo,这里DoTask继承了RecursiveAction,里面的有start和end,还有最多处理list中THRESHOLD条数据。

然后我们运行一下:

输出:

对于需要单独或自定义pool的应用程序,可以使用给定的目标并行度级别构造ForkJoinPool;默认情况下,等于可用处理器的数量。。

默认情况下,common pool使用默认参数构造,但可以通过设置三个系统属性来控制它们:

此实现将最大运行线程数限制为32767.尝试创建大于最大数量的池会导致IllegalArgumentException。

仅当pool关闭或内部资源耗尽时,此实现才会拒绝提交的任务(即通过抛出RejectedExecutionException)。

下面摘录一段(https://www.cnblogs.com/wanly3643/p/3956801.html),等我看了Doug Lea大神的,再写一点:

仔细看了Doug Lea的那篇文章:A Java Fork/Join Framework 中关于Work-Stealing的部分,下面列出该算法的要点(基本是原文的翻译):

1. 每个Worker线程都维护一个任务队列,即ForkJoinWorkerThread中的任务队列。

2. 任务队列是双向队列,这样可以同时实现LIFO和FIFO。

3. 子任务会被加入到原先任务所在Worker线程的任务队列。

4. Worker线程用LIFO的方法取出任务,也就后进队列的任务先取出来(子任务总是后加入队列,但是需要先执行)。

5. Worker线程的任务队列为空,会随机从其他的线程的任务队列中拿走一个任务执行(所谓偷任务:steal work,FIFO的方式)。

6. 如果一个Worker线程遇到了join操作,而这时候正在处理其他任务,会等到这个任务结束。否则直接返回。

7. 如果一个Worker线程偷任务失败,它会用yield或者sleep之类的方法休息一会儿,再尝试偷任务(如果所有线程都是空闲状态,即没有任务运行,那么该线程也会进入阻塞状态等待新任务的到来)。

Doug Lea

参考:

http://ifeve.com/java-fork-join-framework/#more-35602

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinPool.html

http://gee.cs.oswego.edu/dl/papers/fj.pdf()

 

有什么讨论的内容,可以加我公众号:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值