gpt4 book ai didi

java - 如何使用多线程将多个文本文件读入一个列表?

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

我正在学习Java中的多线程。练习时,我希望多线程以并行方式读取三个txt文件,并将三个文件的每一行添加到一个列表中。这是我的代码:

ArrayList<String> allLinesFromFiles= new ArrayList<String>();
Lock blockThread=new ReentrantLock();
Thread t = null;
for (String file : files) {

t= new Thread(new Runnable() {
@Override
public void run() {
try {
FileReader fichero;
fichero = new FileReader(file);
BufferedReader bufferFichero = new BufferedReader(fichero);
String line = bufferFichero.readLine();

while (line != null) {
writeList(line.toLowerCase());
line = bufferFichero.readLine();
}

bufferFichero.close();

}catch (IOException e) {
System.out.println("Error IO");
}
}

private void writeList(String line) {
blockThread.lock();
allLinesFromFiles.add(line);
blockThread.unlock();
}
});
t.start();
}
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
Collections.sort(allLinesFromFiles);
我在方法“writeList”中使用了锁定/解锁(ReentrantLock)进行同步,因为在我认为可能需要在ArrayList中写入三个线程的情况。是正确的?我是否要使用CopyOnWriteArrayList而不是ArrayList?
我使用join()等待三个线程的完成,但是我的代码无法正常工作。

最佳答案

基于您的代码的一种简单方法是添加一个AtomicInteger计数,以了解读取线程是否结束,而主线程等待结束:

List<String> files = Arrays.asList("a.txt", "b.txt", "c.txt");
ArrayList<String> allLinesFromFiles= new ArrayList<String>();
Lock blockThread=new ReentrantLock();
AtomicInteger count = new AtomicInteger(0); // counter
Thread t = null;
for (String file : files) {
t= new Thread(new Runnable() {
@Override
public void run() {
try {
FileReader fichero;
fichero = new FileReader(getClass().getClassLoader().getResource(file).getFile());
BufferedReader bufferFichero = new BufferedReader(fichero);
String line = bufferFichero.readLine();

while (line != null) {
writeList(line.toLowerCase());
line = bufferFichero.readLine();
}

bufferFichero.close();
}catch (IOException e) {
e.printStackTrace();
System.out.println("Error IO");
}finally {
count.getAndIncrement(); // counter ++
}
}

private void writeList(String line) {
blockThread.lock();
allLinesFromFiles.add(line);
blockThread.unlock();
}
});
t.start();
}
while (count.intValue() < 3) {
TimeUnit.MILLISECONDS.sleep(500);
}
Collections.sort(allLinesFromFiles);
System.out.println(allLinesFromFiles);
但是,更好的方法是:
List<String> filePaths = Arrays.asList("a.txt", "b.txt", "c.txt");
List<String> result = new ArrayList<>();
filePaths.parallelStream().forEach(filePath -> {
try {
List<String> strings = Files.readAllLines(
Paths.get(ReadTest.class.getClassLoader().getResource(filePath).toURI()));
result.addAll(strings);
} catch (IOException | URISyntaxException e) {
e.printStackTrace();
}
});
Collections.sort(result);
System.out.println(result);

关于java - 如何使用多线程将多个文本文件读入一个列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66237276/

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