【问题标题】:Using 10 parallel Threads to find Largest value in an array使用 10 个并行线程查找数组中的最大值
【发布时间】:2015-10-26 20:35:06
【问题描述】:

我对 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();
 }
}

到目前为止,我只有两个线程。我希望两个线程都读取文本文件并给我它认为该文本文件中最大的数字。我认为当我有多个线程同时工作时,它可能会给我不同的结果。

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

【问题讨论】:

  • 在主线程中读取文件内容并填充你的数组。之后,创建每个线程,负责从数组的给定不同部分中找到最大值。一旦每个线程完成找到最大值,主线程就可以通过它们的输出来找到 Jiri 指出的整体最大值。
  • 在计算总体最大值之前,您需要您的主线程等待其他线程完成。
  • @IzCe 谢谢。所以我必须让它搜索数组的某个部分?嗯...我猜有一个 for 循环?也许分配线程 1 来查看索引 0 到 999,线程 2 - 1000 到 1999。等等?不知道该怎么做,我会尝试的。你会说我应该像上面那样创建线程吗?例如:'Thread thread2 = new Thread() - 或者有没有更好的方法来创建 10 个线程而不单独执行它们?
  • 开始和结束索引看起来像你在你的案例中提到的。但是,我会根据数据条目数 (randomNumbersCount) 和线程数 (threadCount) 进行参数化并计算它们。然后我会重构 PDF 类来使用它,就像 (1) PDF [] threads = new PDF[threadCount]; (2) 在循环中: PDF[i] = new PDF(randomNumbers, startIndex, endIndex, threadResult); (3) 在另一个循环中:PDF[i].start(); (4) 在另一个循环中:PDF[i].join();强制主线程将等待完成其他线程。 (5) 主线程,遍历threadResult对象。
  • 线程结果可以简单地定义为class ThreadResult { private int max; public void setMax(int max) { this.max = max; } },然后在上面的步骤2中创建一个ThreadResult数组并将相应的对象传递给PDF。

标签: java arrays multithreading io


【解决方案1】:

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

【讨论】:

  • 嗯.. 我希望一个线程读取文件,但委托其他线程处理计算并收集结果。所以要做到这一点,我会委托线程来读取数组的某些部分(txt 文件)?
  • 要么给他们引用(相同的)数组和(不同的)开始和停止索引,要么将输入读入列表并使用subList()
猜你喜欢
  • 2015-04-19
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
相关资源
最近更新 更多