多核处理器已经在计算机上的广泛应用,为了更好的利用多处理器的长处,软件需要运行在并行状态下。JDK7引入了全新的Fork/Join架构用于并行编程,这可以应用于多处理器的机器上以提高程序的效率。
Fork/Join架构下图所示:
这种架构定义了一个使用ForkJoinTask的类,并且在一个ForkJoinPool的实例中执行任务。ForkJoinTask是一个为执行任务而设计的抽象类,它类似一个线程,但是比一般的线程更轻便。因为任务的大量数据和子任务可以被ForkJoinPool中实际的更小的线程执行一个任务被Fork分离成若干个子任务,并且被多处理器系统并行处理,当所有的处理完毕后通过Join再“合成”最后的结果。可以说Fork/Join 架构对程序的并行化是分治思想的一种体现。RecursiveAction和RecursiveTaskare是ForkJoinTask的两个子类。用来定义一个具体的任务类,用户自己新建的类必须继承自 RecursiveAction或者RecursiveTask。RecursiveActionis用于无返回值的任务, 而 RecursiveTaskis用于有返回值的任务。然后再重写 compute()方法来具体描述任务的操作。下面用一段归并排序来测试并行编程与普通的顺序编程的优劣:
public class ParalleMergeSort {
public static void main(String[] args) {
final int SIZE=7000000;
int[] list1=new int[SIZE];
int[] list2=new int[SIZE];
for (int i = 0; i < list1.length; i++) {
list1[i]=list2[i]=(int)(Math.random()*10000000);
}
long startTime=System.currentTimeMillis();
ParalleMergeSort(list1);
long endTime=System.currentTimeMillis();
System.out.println("\nParallel time with "+Runtime.getRuntime().availableProcessors()+" processors is "+(endTime-startTime)+" milliseconds");
startTime=System.currentTimeMillis();
MergeSort.mergeSort(list2);
endTime=System.currentTimeMillis();
System.out.println("\nSequential time is "+(endTime-startTime)+" milliseconds");
}
public static void ParalleMergeSort(int[] list) {
RecursiveAction mainTask=new SortTask(list);
ForkJoinPool pool=new ForkJoinPool();
pool.invoke(mainTask);
}
private static class SortTask extends RecursiveAction{
private final int THRESHOLD=500;
private int[] list;
public SortTask(int[] list) {
this.list=list;
}
protected void compute() {
if(list.length<THRESHOLD)
java.util.Arrays.sort(list);
else{
int[] firstHalf=new int[list.length/2];
System.arraycopy(list, 0, firstHalf, 0, list.length/2);
int secondHalfLength=list.length-list.length/2;
int[] secondHalf=new int[secondHalfLength];
System.arraycopy(list,list.length/2 ,secondHalf, 0,secondHalfLength);
invokeAll(new SortTask(firstHalf),new SortTask(secondHalf));
MergeSort.merge(firstHalf, secondHalf, list);
}
}
}
}
运行结果:
可以看到并行编程比顺序编程的运行速度要快得多。