我获得了以下代码,该代码生成一个大型数组并找到最大值。
import java.util.Date;
import java.util.Random;
class FindMax {
private static final int N = 256 * 1024 * 1024;
public static void main(String args[]) {
assert(N > 0);
int array[] = new int [N];
assert(array != null);
Random random = new Random(new Date().getTime());
for (int i = 0; i < N; i++) {
array[i] = random.nextInt();
}
Date start = new Date();
int max = array[0];
for (int i = 1; i < N; i++) {
if (array[i] > max) {
max = array[i];
}
}
Date end = new Date();
System.out.println("max: " + max);
System.out.println("time in msec: " + (end.getTime() - start.getTime()));
}
}
我要改变代码以使其更快,方法是创建多个线程,每个线程找到数组的一部分的最大值,然后主线程找到线程找到的最大值的最大值。这就是我到目前为止所提出的。
import java.util.Date;
import java.util.Random;
class FindMax extends Thread{
private static final int N = 256 * 1024 * 1024;
static int array[] = new int [N];
static int max = array[0];
public void run(){
for (int i = 1; i < N; i++) {
if (array[i] > max) {
max = array[i];
}
}
}
public static void main(String args[]) {
assert(N > 0);
int ts = Integer.parseInt(args[0]);
assert(array != null);
Random random = new Random(new Date().getTime());
for (int i = 0; i < N; i++) {
array[i] = random.nextInt();
}
Date start = new Date();
Thread t[] = new Thread[ts];
for( int p=0; p<ts;p++){
t[p] = new FindMax();
t[p].start();
}
Date end = new Date();
System.out.println("max: " + max);
System.out.println("time in msec: " + (end.getTime() - start.getTime()));
}
}
我不明白这一点,所以我做错了什么?
答案 0 :(得分:1)
你有个好的开始。接下来你需要做的是给FindMax
类两个成员变量来表示要搜索的范围的开始和结束。在1
循环中使用这两个成员变量代替N
和for
。然后给FindMax
一个构造函数,您可以使用它来设置这两个值。然后在构造FindMax
对象的循环中,为每个对象提供一个唯一的搜索范围。最后,给FindMax
成员变量以存储最大值,以便main()
可以查询每个FindMax
找到的最大值。
您可能希望使用join()
类的Thread
方法 - 它会在返回之前等待Thread
完成。