Java:如何在递归文件夹大小查找算法中实现多线程?

Java:如何在递归文件夹大小查找算法中实现多线程?,java,multithreading,parallel-processing,Java,Multithreading,Parallel Processing,所以,我已经开发了文件夹大小查找器的单线程版本,但为了使它更有趣,我想提高它的速度,并希望发展我对多线程进程的理解。然而,经过30次修订后,似乎总是存在一个问题,无论是: -主线程在完成所有线程之前打印结果 -长类型在不应该溢出时溢出(可能是重复计数) -多线程版本比单线程版本耗时更长 我不知所措,我不知道这样的问题是不是不适合多线程,还是我做的不对。我把我最“成功”的修订放在下面 我意识到,从技术上讲,这是开始,然后立即加入工人线程,使其几乎比单踏板更糟糕。但是,这是我获得主线程以显示正确结果

所以,我已经开发了文件夹大小查找器的单线程版本,但为了使它更有趣,我想提高它的速度,并希望发展我对多线程进程的理解。然而,经过30次修订后,似乎总是存在一个问题,无论是:
-主线程在完成所有线程之前打印结果
-长类型在不应该溢出时溢出(可能是重复计数)
-多线程版本比单线程版本耗时更长

我不知所措,我不知道这样的问题是不是不适合多线程,还是我做的不对。我把我最“成功”的修订放在下面

我意识到,从技术上讲,这是开始,然后立即加入工人线程,使其几乎比单踏板更糟糕。但是,这是我获得主线程以显示正确结果的唯一方法

因此,我的主要问题是让工作线程只在最后连接,使其并行地浏览所有子文件夹,然后与主线程连接以显示正确的结果。
package-sizeBrowserCode;
导入java.io.File;
导入java.io.FileWriter;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
导入java.util.concurrent.TimeUnit;
公共班机{
静态长时间;
静态线程工人;
静态长和;
私有静态长getLength(){
返回Main.longer;
}
私有静态void setLength(长变量){
Main=var;
}
私有静态长getFolderSize(文件文件夹){
长长度=0;
File[]files=文件夹.listFiles();
int count=files.length;
for(int i=0;i=1024){
Kb=字节/1024;
字节=0;
结果=“千字节”;
如果(Kb>=1024){
Mb=Kb/1024;
Kb=0;
结果=“兆字节”;
如果(Mb>=1024){
Gb=Mb/1024;
Mb=0;
结果=“千兆字节”;
如果(Gb>=1024){
Tb=Gb/1024;
Gb=0;
结果=“TB”;
}
}
}
}否则{
结果=“字节”;
}
双和=字节+Mb+Gb+Tb;
返回(总和+结果);
}
公共静态void main(字符串[]args){
选择的字符串\u Folder=args[0];
字符串优先单位;
全尺寸字符串;
试一试{
首选_单位=args[1];
}捕获(例外e){
首选_单位=空;
}
字符串local_Folder=System.getProperty(“user.dir”);
文件完整路径;
字符串反斜杠=“\\”;
字符串正斜杠=“/”;
分线器;
if(System.getProperty(“os.name”).toLowerCase().indexOf(“win”)>=0){
分隔符=反斜杠;
}否则{
分隔符=正斜杠;
}
完整路径=新文件(本地文件夹+分隔器+所选文件夹);
System.out.println(完整路径);
long startTime=System.nanoTime();
if(首选单位!=null){
full_Size=转换_字节(getFolderSize(full_路径),首选_单位);
}否则{
full_Size=convert_字节(getFolderSize(full_路径));
}
long-endTime=System.nanoTime();
System.out.println(“所选文件夹+的大小为:“+完整大小”);
System.out.println(“take”+时间单位.NANOSECONDS.toSeconds(endTime startTime)+“执行秒数”);
文件大小\指示器=新文件(完整\路径+分隔符+FileSize.txt);
试一试{
size_Indicator.createNewFile();
FileWriter writer=新的FileWriter(大小\指示器);
writer.write(全尺寸);
writer.close();
}捕获(例外e){
系统错误println(e);
}
}

}

只是为了补充其他答案

尽量避免使用

worker = new Thread(new Runnable() {
    ...
  }
改用遗嘱执行人。它们更易于使用、计划、运行和返回结果。此外,它们还负责线程池和其他开销

阅读


执行器从Java 5开始就可用,它们是任何JVM的组成部分。

只是补充其他答案

尽量避免使用

worker = new Thread(new Runnable() {
    ...
  }
改用遗嘱执行人。它们更易于使用、计划、运行和返回结果。此外,它们还负责线程池和其他开销

阅读

执行器从Java5开始就可用,它们是任何