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

Java并行编程(parallel programming) 2

2015-12-18 09:30 573 查看
另一个并行编程的例子是利用并行编程方法寻找一个大数组中的最大值,为了得到最大值我们需要得到一个最大值的返回值,因此我们定义了一个继承自RecursiveTask<Integer>任务类,compute需要重写来返回数组中的最大值,如果这是个小数组,那么采用顺序编程的方法是更有效率的,如果这是一个大数组那么就需要将这个数组分成左右两部分,即左右同时分别寻找数组内的最大值,调用函数中的fork()方法使得任务得以执行,join()方法等待所有任务完成返回最后的结果。

代码如下:

public class ParallelMax {
public static int max(int[] list){
RecursiveTask<Integer> task=new MaxTask(list, 0, list.length);
ForkJoinPool pool=new ForkJoinPool();
return pool.invoke(task);
}

public static class MaxTask extends RecursiveTask<Integer>{
private static final long serialVersionUID = 12557L;
private final static int THRESHOLD=1000;
private int[] list;
private int low;
private int high;

public MaxTask(int[] list,int low,int high) {
this.list=list;
this.low=low;
this.high=high;
}

protected Integer compute() {
if(high-low<THRESHOLD){
int max=list[0];
for (int i = 0; i < high; i++) {
if(list[i]>max)
max=list[i];
}
return new Integer(max);
}else{
int mid=(low+high)/2;
RecursiveTask<Integer>left=new MaxTask(list, low, mid);
RecursiveTask<Integer>right=new MaxTask(list, mid, high);

right.fork();
left.fork();
return new Integer(Math.max(left.join().intValue(), right.join().intValue()));
}
}
}

public static void main(String[] args) {
final int N=9000000;
int[] list=new int
;
for (int i = 0; i < list.length; i++) {
list[i]=i;
}

long startTime=System.currentTimeMillis();
System.out.println("\nThe maximal number is "+ max(list));
long endTime=System.currentTimeMillis();
System.out.println("The number of processors is "+
Runtime.getRuntime().availableProcessors());
System.out.println("Time is "+ (endTime - startTime)+
" milliseconds");
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: