Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 搜索数组的一部分的多个线程_Java_Multithreading - Fatal编程技术网

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
类两个成员变量,以表示要搜索的范围的开始和结束。使用这两个成员变量代替
1for
循环中的code>和
N
。然后给
FindMax
一个构造函数,您可以用它来设置这两个值。然后在构造
FindMax
对象的循环中,给每个对象一个唯一的搜索范围。最后,给
FindMax
一个成员变量来存储最大值,以便
main()
可以查询每个
FindMax
找到的最大值


您可能需要使用
Thread
类的
join()
方法——它在返回之前等待
Thread
完成。

您没有让每个线程在数组的一部分上运行,也没有让结果集(
array
)以任何方式都是线程安全的。您没有让每个线程在数组的一部分上运行,结果集也不是(
array
)线程安全。谢谢!我完成了,但效果与预期相反。我无法将代码放入此评论框,因此我在此处发布了一个新问题:谢谢!我完成了,但效果与预期相反。我无法将代码放入此评论框,因此我在此处发布了一个新问题: