黑马程序员:多线程 VS 传统办法——取二维数组的最值

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

多线程取得二维数组的最值。
思路:首先,获取一个随机的二维数组。二维数组有行(row)和列(col),我们可以把二维数组,看作是row个长度(length)为col的一维数组,使用多线程技术,分别比较row个一维数组取得最值。然后在比较所有的最值,取得二维数组的最值。
使用的API类和方法:Thread,Math,
                 Math.max(double,double):比较两个参数的值,取最大值
                 Math.min(double,double):比较两个参数的值,取最小值
                 join():将线程插入运行
                 start()。
多线程取得二维数组详解如下:
首先,定义一个取得随机二维数组的类,在这个类中,定义一个静态的方法取得double类型的二维数组。
class RandomArray{

//获取随机二维数组,需要传入两个参数——行(row)和列(col)
public static double[][] getArray(int row,int col){
double[][] array = new double[row][col];
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
//给数组的每个位置赋予随机数
array[i][j] = Math.random()*(row+1);  
}
}
return array;
}
}
其次,定义一个线程类,继承Thread,并覆盖了run方法。该类提供了一个参数为一个一维数组的构造函数。在run方法中,取得这个一维数组的最值。在该类中把最大值和最小值私有化,并提供了两个get方法,以获取最值。
class ArrayMax extends Thread{
private double[] array;
private double max = Double.MIN_VALUE;
private double min = Double.MAX_VALUE;

//带参数的构造函数,参数是一个一维数组
public ArrayMax(double[] array){
this.array = array;
}

//覆盖父类Thread的run方法,获取二维数组中每个一维数组的最大值
public void run(){
for(int i=0;i<array.length;i++){
max = Math.max(max, array[i]);
}
for(int i=0;i<array.length;i++){
min = Math.min(min, array[i]);
}
}

//取得最大值
public double getMax(){
return max;
}

//取得最小值
public double getMin(){
return min;
}
}
上面的准备工作已经完成,下面我们定义一个类来测试一下效率:
public class ArrayMaxTest {
public static void main(String[] args) {
//定义二维数组的行和列,并初始化
int row = 100, col = 2000;
//定义最大值和最小值,并初始化
double max = Double.MIN_VALUE;
double min = Double.MAX_VALUE;
//定义开始时间和结束时间,并初始化
long startTime = 0,endTime = 0;
//获取目标数组,调用上面定义的RandomArray这个类,获得一个随机数组
double[][] array = RandomArray.getArray(row, col);
//创建线程数组,该数组长度等于二维数组的行(row)
ArrayMax[] arrayThread = new ArrayMax[row];
//创建线程,是上面的二维数组的每一行被一个线程处理。并调用start方法,使所有的线程进入可运行状态
for(int i=0;i<arrayThread.length;i++){
arrayThread[i] = new ArrayMax(array[i]);
arrayThread[i].start();
}
//设置开始时间
startTime = System.currentTimeMillis();
for(int i=0;i<row;i++){
try {
arrayThread[i].join();//将线程插入运行
//比较每个线程的最大值,得到最终的最大值
max = Math.max(max, arrayThread[i].getMax());
//比较每个线程的最小值,得到最终的最小值
min = Math.max(min, arrayThread[i].getMin());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//设置结束时间
endTime = System.currentTimeMillis();
//打印结果
System.out.println("最大值..." + max);
System.out.println("最小值..." + min);
System.out.println("开始时间:" + startTime + 
"\n结束时间:" + endTime + 
"\n用时:" + (endTime - startTime));
}
}
哇!!!运行速度太快了,基本上不花时间。看看结果:
最大值...100.99999029957448
最小值...1.7976931348623157E308
开始时间:1393947130774
结束时间:1393947130774
用时:0

我们再来看看传统方式取得二维数组最值:设置一个最小值,然后与数组中的数逐个比较,获得最值。
我们仍然使用上面的类RandomArray,来获取一个随机的二维数组。
public class ArrayMaxChuantong {
public static void main(String[] args) {
//定义二维数组的行和列,并初始化
int row = 100, col = 2000;
//定义最大值和最小值,并初始化
double max = Double.MIN_VALUE;
double min = Double.MAX_VALUE;
//定义开始时间和结束时间,并初始化
long startTime = 0,endTime = 0;
//获取目标数组
double[][] array = RandomArray.getArray(row, col);
//设置开始时间
startTime = System.currentTimeMillis();
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
//比较获得数组的最大值
max = Math.max(max, array[i][j]);
//比较获得数组的最小值
min = Math.max(min, array[i][j]);
}
}
//设置结束时间
endTime = System.currentTimeMillis();
System.out.println("最大值..." + max);
System.out.println("最小值..." + min);
System.out.println("开始时间:" + startTime + 
  "\n结束时间:" + endTime + 
  "\n用时:" + (endTime - startTime));
}
}
嗯,这个运行也挺快的,看看结果:
最大值...100.99921940989917
最小值...1.7976931348623157E308
开始时间:1393947733687
结束时间:1393947733693
用时:6
虽然用的时间也挺少,但是相对多线程的方式,还是耗时挺大的。另外,我们现在给的二维数组还不够大,更大的话,耗时差距会更大。


---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------
                                                                                                                                                                                         
详细请查看: http://edu.csdn.net


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值