Nag*_* JB 5 java multithreading
我正在学习多线程,并希望使用不同的线程同时读取不同线程中的多个文本文件,并在单个列表中获取结果。我有包含员工名字和姓氏的文本文件。
我写了以下 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;
}
}
Run Code Online (Sandbox Code Playgroud)
用于读取文件的类,使用 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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
具有主要方法和线程的类。
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());
}
}
Run Code Online (Sandbox Code Playgroud)
使用 join() 方法是否确保完成调用它的线程并继续执行另一个线程?如果是,多线程的意义何在?有没有其他方法可以确保所有线程并行运行并在它们都在 main() 方法中完成后从它们收集结果?
所有线程并行运行,但是您的readFile方法是同步的,因此任何时候只有一个线程可以进入该方法(每个对象)。这是一个不错的选择,因为它可以防止并发更新ArrayList(这不是线程安全的),但也意味着任何时候都有两个线程在进入该方法之前等待readFile。
如果您创建三个FileReading实例,您的代码将并行运行。
该join()方法执行另一种同步:它阻塞调用线程,直到run()另一个线程的方法退出。因此,您可以确定join在代码中的 3 个 s 之后,三个线程已经完成。