Java 使用10个并行线程查找数组中的最大值

Java 使用10个并行线程查找数组中的最大值,java,arrays,multithreading,io,Java,Arrays,Multithreading,Io,一般来说,我对Java和编程相当陌生,所以我在这里遇到了一些困难 我目前正在尝试将我几周前开发的一个程序应用于线程功能。我想让我的Java程序读取一个名为“dataset529.txt”的文本文件(其中有100k个数字),并使用10个并行线程执行此操作。我想让它读取文件并告诉我其中最大的数字,但这样做需要10个线程。我最初尝试对线程使用循环,但现在我分别定义每个线程,如thread1、thread2等 现在我正在试验如何做到这一点。我不确定我是否在正确的轨道上 这就是我目前所拥有的 import

一般来说,我对Java和编程相当陌生,所以我在这里遇到了一些困难

我目前正在尝试将我几周前开发的一个程序应用于线程功能。我想让我的Java程序读取一个名为“dataset529.txt”的文本文件(其中有100k个数字),并使用10个并行线程执行此操作。我想让它读取文件并告诉我其中最大的数字,但这样做需要10个线程。我最初尝试对线程使用循环,但现在我分别定义每个线程,如thread1、thread2等

现在我正在试验如何做到这一点。我不确定我是否在正确的轨道上

这就是我目前所拥有的

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ProcessDataFileParallel extends Thread implements Runnable{
public void ReadText() throws IOException{
    String emptyString;
    FileReader fr = new FileReader("dataset529.txt");
    BufferedReader br = new BufferedReader(fr);
    emptyString = br.readLine();

    int max = Integer.MIN_VALUE;
    int i = 0;
    int[] randomNumbers = new int [100000];

    while ((emptyString = br.readLine()) != null) {
        randomNumbers[i++] = Integer.parseInt(emptyString);   
    }
    for (i = 0; i < randomNumbers.length; i++)
        if (randomNumbers[i] > max)       
            max = randomNumbers[i];
    System.out.println("The Largest Number from 'CreateDataFile's' array is : "+ max);


}


 public static void main (String[] args) throws IOException {

    Thread thread1 = new Thread(){
        public void run(){
        ProcessDataFileParallel PDF = new ProcessDataFileParallel();
        try{
            PDF.ReadText();
        }catch (IOException e){
            e.printStackTrace();
        }
    }

};
Thread thread2 = new Thread(){
    public void run(){
        ProcessDataFileParallel PDF = new ProcessDataFileParallel();
        try{
            PDF.ReadText();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
};

thread1.start();
thread2.start();
 }
}
导入java.io.BufferedReader;
导入java.io.FileReader;
导入java.io.IOException;
公共类ProcessDataFileParallel扩展线程实现可运行{
public void ReadText()引发IOException{
弦空弦;
FileReader fr=新的FileReader(“dataset529.txt”);
BufferedReader br=新的BufferedReader(fr);
emptyString=br.readLine();
int max=整数的最小值;
int i=0;
int[]随机数=新int[100000];
而((emptyString=br.readLine())!=null){
randomNumbers[i++]=Integer.parseInt(emptyString);
}
对于(i=0;i最大值)
max=随机数[i];
System.out.println(“CreateDataFile”数组中的最大数字为:“+max”);
}
公共静态void main(字符串[]args)引发IOException{
线程thread1=新线程(){
公开募捐{
ProcessDataFileParallel PDF=新的ProcessDataFileParallel();
试一试{
PDF.ReadText();
}捕获(IOE异常){
e、 printStackTrace();
}
}
};
线程thread2=新线程(){
公开募捐{
ProcessDataFileParallel PDF=新的ProcessDataFileParallel();
试一试{
PDF.ReadText();
}捕获(IOE异常){
e、 printStackTrace();
}
}
};
thread1.start();
thread2.start();
}
}
到目前为止,我只有两个线程。我希望两个线程都读取文本文件,并给出它认为该文本文件中最大的数字。我想当我有多个线程同时工作时,它可能会给我不同的结果


任何帮助都将不胜感激。谢谢

两个线程都在读取整个文件,因此它们都执行相同的完整计算。您可能希望每个线程只读取文件的一部分,或者一个线程读取文件并将计算委托给其他线程并收集其结果(即计算所有线程返回的最大值)。

读取主线程中的文件内容并填充数组。然后,创建每个线程,负责从数组的给定不同部分查找最大值。一旦每个线程完成查找最大值,主线程就可以通过其输出来查找Jiri指出的总体最大值。您需要主线程等待其他线程完成,然后再计算总体最大值。@IzCe谢谢。所以我必须让它搜索数组的某个部分?隐马尔可夫模型。。。我猜是用for循环?可能会指定线程1查看索引0到999,线程2-1000到1999。等我不知道该怎么做,不过我会试试的。你认为我应该像上面那样创建线程吗?例如:“Thread thread2=new Thread()-或者有没有更好的方法来创建10个线程而不单独执行它们?开始和结束索引将与您在案例中提到的类似。但是,我会将其参数化,并根据数据条目的数量(randomNumbersCount)和线程数量(threadCount)计算它们。然后我会重构PDF类以使用它,就像(1)PDF[]threads=newPDF[threadCount];(2) 在循环中:PDF[i]=新的PDF(随机数、startIndex、endIndex、threadResult);(3) 在另一个循环中:PDF[i].start();(4) 但在另一个循环中:PDF[i].join();强制主线程等待其他线程完成。(5) 主线程,在threadResult对象之间循环。线程结果可以简单地定义为
类threadResult{private int max;public void setMax(int max){this.max=max;}}}
,然后在上面的步骤2中创建一个threadResult数组并将相应的对象传递给PDF。Hmm。。我希望一个线程读取该文件,但委托其他线程处理计算并收集结果。为此,我将委托线程读取数组的某些部分(txt文件)?或者给它们引用(相同)数组和(不同)开始和停止索引,或者将输入读入列表并使用。