Java并行编程(parallel programming)

26 篇文章 0 订阅
20 篇文章 3 订阅

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


可以看到并行编程比顺序编程的运行速度要快得多。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值