Java 搜索数组的一部分的多个线程
下面的代码生成一个大数组,并找到最大值Java 搜索数组的一部分的多个线程,java,multithreading,Java,Multithreading,下面的代码生成一个大数组,并找到最大值 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 !=
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;
导入java.util.Random;
类FindMax{
私有静态最终整数N=256*1024*1024;
公共静态void main(字符串参数[]){
断言(N>0);
int数组[]=新的int[N];
断言(数组!=null);
Random Random=新随机(new Date().getTime());
对于(int i=0;imax){
max=数组[i];
}
}
日期结束=新日期();
System.out.println(“max:+max”);
System.out.println(“以毫秒为单位的时间:+(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()));
}
}
import java.util.Date;
导入java.util.Random;
类FindMax扩展了线程{
私有静态最终整数N=256*1024*1024;
静态整数数组[]=新整数[N];
静态int max=数组[0];
公开募捐{
对于(int i=1;imax){
max=数组[i];
}
}
}
公共静态void main(字符串参数[]){
断言(N>0);
intts=Integer.parseInt(args[0]);
断言(数组!=null);
Random Random=新随机(new Date().getTime());
对于(int i=0;i 对于(int p=0;p你有了一个好的开始。接下来你需要做的是给FindMax
类两个成员变量来表示要搜索的范围的开始和结束。在for
循环中,用这两个成员变量代替1
和N
。然后给FindMax
一个带您可以设置这两个值。然后在构造FindMax
对象的循环中,为每个对象指定一个唯一的搜索范围。最后,为FindMax
指定一个成员变量来存储最大值,以便main()
可以查询每个FindMax
找到的最大值
您可能需要使用join()线程
类的
方法——它等待一个线程
完成后再返回。您有了一个良好的开始。接下来需要做的是给FindMax
类两个成员变量,以表示要搜索的范围的开始和结束。使用这两个成员变量代替1在for
循环中的code>和N
。然后给FindMax
一个构造函数,您可以用它来设置这两个值。然后在构造FindMax
对象的循环中,给每个对象一个唯一的搜索范围。最后,给FindMax
一个成员变量来存储最大值,以便main()
可以查询每个FindMax
找到的最大值
您可能需要使用Thread
类的join()
方法——它在返回之前等待Thread
完成。您没有让每个线程在数组的一部分上运行,也没有让结果集(array
)以任何方式都是线程安全的。您没有让每个线程在数组的一部分上运行,结果集也不是(array
)线程安全。谢谢!我完成了,但效果与预期相反。我无法将代码放入此评论框,因此我在此处发布了一个新问题:谢谢!我完成了,但效果与预期相反。我无法将代码放入此评论框,因此我在此处发布了一个新问题: