gpt4 book ai didi

java - 在Java中读取不同线程中的多个文本文件

转载 作者:行者123 更新时间:2023-12-03 12:44:27 27 4
gpt4 key购买 nike

我正在学习多线程,并希望使用不同的线程同时读取不同线程中的多个文本文件,并在单个列表中获取结果。我有包含员工名字和姓氏的文本文件。
我写了以下 Employee 类。

class Employee {
String first_name;
String last_name;
public Employee(String first_name, String last_name) {
super();
this.first_name = first_name;
this.last_name = last_name;
}
}
用于读取文件的类,使用 List 来存储对象。
class FileReading {
List<Employee> employees = new ArrayList<Employee>();
public synchronized void readFile(String fileName) {
try {
FileReader fr = new FileReader(new File(fileName));
BufferedReader br = new BufferedReader(fr);
String line;
while ((line = br.readLine()) != null) {
String[] arr = line.split("\\s+");
employees.add(new Employee(arr[0], arr[1]));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
具有主要方法和线程的类。
public class TestMultithreading {

public static void main(String[] args) {

final FileReading fr = new FileReading();

Thread t1 = new Thread() {
public synchronized void run() {
fr.readFile("file1.txt");
}
};

Thread t2 = new Thread() {
public synchronized void run() {
fr.readFile("file2.txt");
}
};

Thread t3 = new Thread() {
public synchronized void run() {
fr.readFile("file3.txt");
}
};

t1.start();
t2.start();
t3.start();

try {
t1.join();
t2.join();
t3.join();
} catch (InterruptedException e1) {
e1.printStackTrace();
}

System.out.println(fr.employees.size());
}
}
使用 join() 方法是否确保完成调用它的线程并继续执行另一个线程?如果是,多线程的意义何在?
有没有其他方法可以确保所有线程并行运行并在它们都在 main() 方法中完成后从它们收集结果?

最佳答案

所有线程并行运行,但是您的 readFile方法是同步的,因此任何时候(每个对象)只有一个线程可以进入它。这是一个不错的选择,因为它会阻止更新 ArrayList (这不是线程安全的)并发,但也意味着任何时候两个线程在进入 readFile 之前都会等待方法。
如果创建三个 FileReading实例,您的代码将并行运行。join()方法执行另一种同步:它阻塞调用线程,直到 run()另一个线程的方法退出。因此你肯定在三个 join 之后在您的代码中,三个线程已经完成。

关于java - 在Java中读取不同线程中的多个文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66203923/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com