并行计算,能很大的扩大计算机的性能。
在研究java多线程的并发的时候了解到——Java7就提供了这么一个Fork/Join框架来支持并行计算。Fork/Join框架的核心类ForkJoinPool,它能够接收一个ForkJoinTask,并得到计算结果。ForkJoinTask有两个子类,RecursiveTask(有返回值)和RecursiveAction(无返回结果),我们自己定义任务时,只需选择这两个类继承即可,来小试牛刀吧。
import java.util.Random;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
public class SumArray extends RecursiveTask<Integer> {
private static final int THRESHOLD=500000;//阀值
private long[] array;
private int low;
private int high;
public SumArray(long[] array, int low, int high) {
this.array = array;
this.low = low;
this.high = high;
}
@Override
protected Integer compute() {
int sum=0;
if(high-low<=THRESHOLD){
for(int i=low;i<high;i++){
sum+=array[i];
}
}else{
int mid=(low+high)>>>1;
SumArray left=new SumArray(array,low,mid);
SumArray right=new SumArray(array,mid+1,high);
left.fork();
right.fork();
sum=left.join()+right.join();
}
return sum;
}
public static long[] genArray(int size){
long[] array=new long[size];
for(int i=0;i<size;i++){
array[i]=new Random().nextLong();
}
return array;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
long[] array=genArray(1000000);
//System.out.println(Arrays.toString(array));
//1、创建任务
SumArray sumArray=new SumArray(array,0,array.length-1);
long begin=System.currentTimeMillis();
//2、创建线程池ForkJoinPool
ForkJoinPool forkJoinPool=new ForkJoinPool();
//3、提交任务到线程池
forkJoinPool.submit(sumArray);
//4、获取结果
int result=sumArray.get();
long end=System.currentTimeMillis();
long time=end-begin;
System.out.println("计算一百万个数字的和总耗时为:"+time+"ns(纳秒)");
System.out.println("结果是:"+result);
}
}
运行结果如下:
计算一百万个数字的和总耗时为:13ns(纳秒)
结果是:803161272
我的还是很普通的笔记本,服务器就更快了。并行计算用于大数据时代真实给力。