gpt4 book ai didi

java - 使用线程池添加到列表中

转载 作者:行者123 更新时间:2023-12-01 20:27:17 28 4
gpt4 key购买 nike

我正在尝试读取文件并将每一行添加到列表中。

Simple drawing explaining the goal

主类 -

public class SimpleTreadPoolMain {

public static void main(String[] args) {
ReadFile reader = new ReadFile();
File file = new File("C:\\myFile.csv");
try {
reader.readFile(file);
} catch (IOException e) {
e.printStackTrace();
}
}
}

读者类别 -

public class ReadFile {

ExecutorService executor = Executors.newFixedThreadPool(5);//creating a pool of 5 threads

List<String> list = new ArrayList<>();

void readFile(File file) throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String line;
while ((line = br.readLine()) != "") {
Runnable saver = new SaveToList(line,list);
executor.execute(saver);//calling execute method of ExecutorService
}
}

executor.shutdown();
while (!executor.isTerminated()) { }

}

}

保护类 -

public class SaveToList<E> implements Runnable{

List<E> myList;

E line;

public SaveToList(E line, List<E> list) {
this.line = line;
this.myList = list;
}

public void run() {
//modify the line
myList.add(line);

}
}

我尝试将许多保护程序线程添加到同一列表中,而不是将一个保护程序一一添加到列表中。我想使用线程,因为我需要在添加到列表之前修改数据。所以我认为修改数据会花费一些时间。那么并行这部分会减少时间消耗,对吧?

但这行不通。我无法返回包含文件中所有值的全局列表。我只想从文件中获得一个全局值列表。所以代码肯定应该改变。如果有人能指导我,我将不胜感激。

尽管在单个线程中逐一添加可以工作,但使用线程池会使速度更快,对吗?

最佳答案

使用多个线程不会加快任何速度。

你是:

  • 从文件中连续读取一行。
  • 创建可运行对象并将其提交到线程池
  • 然后,可运行程序将内容添加到列表中

鉴于您使用的是 ArrayList,您需要同步对其的访问,因为您正在从多个线程更改它。因此,您将按顺序将内容添加到列表中。

但即使没有同步,IO 所花费的时间也会远远超过将字符串添加到列表中所花费的时间。添加多线程只会进一步减慢速度,因为它正在执行构建可运行程序、将其提交到线程池、调度它等工作。

跳过整个中间步骤会更简单:

  • 从文件中连续读取一行。
  • 按顺序将列表添加到列表中。

所以:

try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String line;
while (!(line = br.readLine()).isEmpty()) {
list.add(line);
}
}

关于java - 使用线程池添加到列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43680085/

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