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

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() 方法中完成后从它们收集结果?

Pio*_*asz 3

所有线程并行运行,但是您的readFile方法是同步的,因此任何时候只有一个线程可以进入该方法(每个对象)。这是一个不错的选择,因为它可以防止并发更新ArrayList(这不是线程安全的),但也意味着任何时候都有两个线程在进入该方法之前等待readFile

如果您创建三个FileReading实例,您的代码将并行运行。

join()方法执行另一种同步:它阻塞调用线程,直到run()另一个线程的方法退出。因此,您可以确定join在代码中的 3 个 s 之后,三个线程已经完成。