Java并行编程(parallel programming)

多核处理器已经在计算机上的广泛应用,为了更好的利用多处理器的长处,软件需要运行在并行状态下。JDK7引入了全新的Fork/Join架构用于并行编程,这可以应用于多处理器的机器上以提高程序的效率。

Fork/Join架构下图所示:

Java并行编程(parallel programming)_第1张图片

这种架构定义了一个使用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);
			}
		}
		
	}
}
运行结果:

Java并行编程(parallel programming)_第2张图片
可以看到并行编程比顺序编程的运行速度要快得多。

你可能感兴趣的:(java,线程,并行编程,并行处理)