您的位置:首页 > 编程语言 > Java开发

Java并行编程(parallel programming)

2015-12-17 13:45 375 查看
多核处理器已经在计算机上的广泛应用,为了更好的利用多处理器的长处,软件需要运行在并行状态下。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);
}
}

}
}运行结果:



可以看到并行编程比顺序编程的运行速度要快得多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: