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");
}
}
代码如下:
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");
}
}
相关文章推荐
- Eclipse安装ADT插件速度慢的解决方法
- java虚拟机-运行时数据区域
- [转]在SpringMVC中获取request对象的几种方式
- Java的类锁和对象锁
- java thumbnail类库生成缩略图
- 集算器协助Java处理结构化文本之条件过滤
- 使用ant 的javac 运行时logback日志 pattern为 [null:-1] 的问题
- JAVA 学习笔记-01
- Java深入 - Java 内存分配和回收机制
- java实用基础
- java序列化和反序列化
- 关于java代码质量的问题
- 关于java代码质量的问题
- 详解Java的Hibernate框架中的List映射表与Bag映射
- 关于java代码质量的问题
- java系列: 对不起,JavaFX——Java 8目前还不能救你(zz)
- 欢迎使用CSDN-markdown编辑器
- Java多线程总结之由synchronized说开去(转)
- Java之美[从菜鸟到高手演变]之Exception
- Spring处理请求参数的几个小细节