gpt4 book ai didi

java - 线程池问题 - 收集文件

转载 作者:行者123 更新时间:2023-11-30 07:20:28 25 4
gpt4 key购买 nike

我需要将某个位置的所有绝对文件路径序列化到 ArrayList 中。我想用 ExecutorServiceFixedThreadPool 来做到这一点。

示例- 位置:c:/folder1; folder1里面有更多的文件夹,都有文件。我希望每次找到一个文件夹时搜索他们的文件以添加到 ArrayList。

public class FilePoolThreads extends Thread {

File fich;
private ArrayList al1;

public FilePoolThreads(File fi, ArrayList<String> al) {
this.fich = fi;
this.al1 = al;
}

public void run() {
FileColector fc = new FileColector();
File[] listaFicheiros = fich.listFiles();

for (int i = 0; i < listaFicheiros.length; i++) {
if (listaFicheiros[i].isFile()) {
al1.add(listaFicheiros[i].getAbsolutePath());
}
}
}
}

我开始收集文件的类:

public class FileColector {

private ArrayList<String> list1 = new ArrayList<>();

public static ArrayList<String> search(File fich,ArrayList<String> list1) {


int n1 = 1;
ExecutorService executor = Executors.newFixedThreadPool(n1);
do {
// FilePoolThreads[] threads=new FilePoolThreads[10];
FilePoolThreads mt = new FilePoolThreads(fich, list1);

executor.execute(mt);

} while (fich.isDirectory());

executor.shutdown();

return list1;
}

我的代码运行不正常,我想我有一些逻辑错误,我需要有人帮助我修复它,我该如何返回 ArrayList?我必须先使用 getInputStream 然后再使用 getOutputStream?

最佳答案

由于这显然是一项学术练习,我将概述如何根据您使用执行程序线程池的要求来解决这个问题。

首先,您需要分析问题并将其分解为可以相互独立完成的可重复工作单元。在这种情况下,基本工作单元是处理单个文件系统目录。每次处理目录时,您将:

  • 检查每个目录条目。
  • 如果目录条目是常规文件,请将其添加到您的列表中。
  • 如果目录项是子目录,则提交处理。

接下来,您需要创建一个Runnable的实现来封装这个基本工作单元的处理。您创建的类的每个实例至少需要以下信息:

  • File 表示要处理的目录。
  • 一个在所有工作人员之间共享的列表,用于向其中添加文件(正如其他人所指出的,ArrayList 不是适合此目的的数据结构)。
  • 对执行器服务的引用,用于为子目录提交任务。

最后,您需要为顶级目录创建一个worker来处理;将其提交给执行者服务;然后等到所有worker都处理完了。最后一部分可能是最棘手的 - 您可能需要使用传递给每个工作人员的 AtomicInteger 来保持运行计数,以跟踪当前正在处理的工作人员数量。

关于java - 线程池问题 - 收集文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13993392/

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