三、Fork-Join机制介绍
Stream之所以可以使用并行运算,之所以能够最大程度的使用CPU资源,是因为他的Fork-Join编程模型,在本章中我们介绍一下Fork-Join的使用,希望读者能掌握在Java中如何使用Fork-Join这一编程模型,本章内容大致如下
v Fork-Join简单使用
v 快速排序算法
v Fork-Join并行快速排序
3.1 Fork-Join简单实用
在开始说Fork-Join的API以及原理之前,我们先来看一个非常简单的例子,让读者能够快速上手,我们在本章中我们实现一个非常简单的算法,就是计算自然数的累加结果,从start到end,然后将结果输出出来即可,这个简单的再也不能简单了。
我们用传统方法实现一个,大家看一下
@Test public void testTradition() { long startTime = System.currentTimeMillis(); int start = 0; int end = 1500000; int sum = 0; for(int i = start;i<end;i++) { sum+=i; } System.out.println("Tradition Result:"+sum+",speed time:"+(System.currentTimeMillis()-startTime)); } |
好了,不想多说了,我们看一下,如何使用Fork-Join来实现这样的需求
package com.wangwenjun.forkjoin;
import java.util.concurrent.RecursiveTask;
/** * Created by wangwenjun on 2015/8/8. */ public class ConcurrencyCalculator extends RecursiveTask<Integer> {
private final int start;
private final int end;
private final static int THRESHOLD = 5;
public ConcurrencyCalculator(int start, int end) { this.start = start; this.end = end; }
@Override protected Integer compute() { int result = 0; if ((end -start) < THRESHOLD) { for (int x = start; x < end; x++) { result += x; } } else { int middle = (start + end) / 2; ConcurrencyCalculator leftCalculator = new ConcurrencyCalculator(start, middle); ConcurrencyCalculator rightCalculator = new ConcurrencyCalculator(middle, end); leftCalculator.fork(); rightCalculator.fork(); result += (leftCalculator.join() + rightCalculator.join()); } |