有一个代码可以在文件夹中查找所需大小的文件。一切正常,但是根据任务的情况,有必要添加多线程,我添加了它,将工作划分为一个线程对文件夹和子文件夹进行排序,第二个线程写入对应的文件条件到控制台。但是当他立即将文件输出到控制台时,排序停止工作(需要按大小降序排列),使用了方法 - fileList.sort(Comparator.comparingLong(File::length).reversed());
为了让它再次工作,建议我不要立即将文件输出到控制台,而是将它们收集在一个集合中,然后排序并打印,我在这个“processFile()”方法中将集合添加到集合中,但是它可能以某种方式歪曲了,因为必要的输出文件也显示在控制台中,但是排序不起作用,告诉我,谁知道如何在我的情况下设置排序。
import java.io.File;
import java.text.DecimalFormat;
import java.util.*;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveAction;
import java.util.concurrent.RecursiveTask;
public class Main{
static Scanner in = new Scanner(System.in);
static File directory = new File(in.next());
public static final double MIN_LENGTH = in.nextDouble() * 1048576;
static int numOfThreads = 4; // количество потоков
public static void main(String[] args) {
ForkJoinPool pool = new ForkJoinPool(numOfThreads);
FileTask task = new FileTask(directory);
pool.invoke(task);
}
public static class FileTask extends RecursiveAction {
private final File file;
public FileTask(File file) {
this.file = file;
}
@Override
protected void compute() {
if (file.isDirectory()) {
processDir();
} else if (file.isFile() && file.length() > MIN_LENGTH) {
processFile();
}
}
private void processFile() {
ArrayList<File> fileList = new ArrayList<>();
fileList.add(file);
fileList.sort(Comparator.<File>comparingLong(File::length).reversed());
for(File file: fileList) {
if (file.length() >= 1073741824) {
DecimalFormat df = new DecimalFormat("#.#");
double Gb = (double) file.length() / 1073741824;
System.out.printf("%s Gb %s%n", df.format(Gb), file);
} else if (file.length() >= 1048576) {
System.out.printf("%s Mb %s%n", file.length() / 1048576, file);
} else if (file.length() >= 1024) {
System.out.printf("%s Kb %s%n", file.length() / 1024, file);
} else if (file.length() < 1024) {
System.out.printf("%s B %s%n", file.length(), file);
} else {
System.out.printf("%s Tb %s%n", file.length() / (1073741824 * 1024), file);
}
}
}
private void processDir() {
ArrayList<FileTask> tasks = new ArrayList<>();
File[] subFiles = file.listFiles();
for (File sub: subFiles) {
tasks.add(new FileTask(sub));
}
ForkJoinTask.invokeAll(tasks);
}
}
}
你被正确地建议将它们(文件)收集到一个集合中,然后排序和打印,所以你应该
processFile首先将打印从方法移动到主类级别,并且还使用RecursiveTask<List<File>>,它将返回一个文件列表:那么主要功能可能如下所示: