JDK7中新增了ForkJoinPool,年前的项目中恰好用到了,今天终于有时间可以自己写个demo并记录下来了。
ps:最近反思自己的工作经历,有些是忙并快乐着的,天天都会有进步,和同事一起讨论问题而不是争论,通过遇到的bug去思考怎么优化产品而不是甩锅。然而这样的工作不常有,遇到了就好好珍惜吧,反正我现在是后悔的要死,但毕竟生活就是生活,没用经济基础空谈理想是会饿死的。在大厂就多想想怎么做人和拼关系,老老实实做好一颗钉;到了小厂就是锻炼人和拼技术了。尽管有时候会被压榨,被PUA,但是无论在哪里都给自己留点buffer,多学习吧。
原理:
1. 将一个任务拆分成多个“小任务”并行执行,即fork;当多个“小任务”执行完成之后,再将这些执行结果汇总起来,即join。有点像Hadoop。
2. 工作窃取机制:ForkJoinPool使用双端队列,当一个线程的任务队列执行完毕后,其他线程的任务队列还没执行完,这时,已经执行完的线程就会到另一个线程的双端任务队列的尾部去窃取任务执行。
常用类:
1. ForkJoinTask:提供了两个子类
RecursiveAction:用于没有返回结果的任务
RecursiveTask:用于有返回结果的任务
2. ForkJoinPool:ForkJoinTask需要通过ForkJoinPool来执行。
代码:
package co