1、Fork/Join框架有什么用呢?
-------》Fork使用来切分任务,Join是用来汇总结果。举个简单的栗子:任务是1+2+3+...+100这个任务(当然这个任务的结果有好的算法去做,现在是用笨方法去计算这个结果)。
------》适合在多核环境下,单核环境使用ForkJoin没什么意思。简单来说就是,一个任务切割成多个小的任务,这些小的任务分配给多个CPU去执行,从而达到提高CPU的执行率。
public class Demo extends RecursiveTask { private int begin; private int end; public Demo(int begin, int end) { this.begin = begin; this.end = end; } @Override protected Integer compute() { System.out.println(Thread.currentThread().getName() + " ... "); int sum = 0; // 拆分任务 if (end - begin <= 2) { // 计算 for (int i = begin; i <= end; i++) { sum += i; } } else { // 拆分 Demo d1 = new Demo(begin, (begin + end) / 2); Demo d2 = new Demo((begin + end)/2 + 1, end); // 执行任务 d1.fork(); d2.fork(); Integer a = d1.join(); Integer b = d2.join(); sum = a + b; } return sum; } public static void main(String[] args) throws Exception { ForkJoinPool pool = new ForkJoinPool(3); Future future = pool.submit(new Demo(1, 100)); System.out.println("...."); System.out.println("计算的值为:" + future.get()); } }
总结:
-----》当我们的CPU不够强劲的时候,使用ForkJoin的话,会很损耗我们的CPU资源。不太适合我们小的PC电脑上运行,适合运行在Linux环境下的。
我们要记住两点就基本可以了。
1、在多核环境下,使用ForkJoin确实能提高执行性能
2、能提高CPU的利用率
个人感觉这个ForkJoin框架使用起来,还有有点难度的,开发人员只需要关注怎样用ForkJoin就可以了,则关注任务是怎样切分的。本人觉得怎样切,也是有点难度。-_-|| (还是看具体使用场景吧。。。)
参考资料:
《java并发编程与实战》龙果学院