gpt4 book ai didi

Java : How to implement Multi-Threading into a recursive folder size finder algorithm?

转载 作者:行者123 更新时间:2023-12-02 11:07:53 25 4
gpt4 key购买 nike

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

我很茫然,我不知道这样的问题是否不适合多线程,或者我是否处理错误。我将我最“成功”的修订放在下面。

我意识到它在技术上开始然后立即加入工作线程,这使得它几乎比单线程更糟糕。然而,这是我让主线程显示正确结果的唯一方法。

所以我的主要问题是让工作线程仅在最后加入,使其并行探索所有子文件夹,然后与主线程加入以显示正确的结果。

package sizeBrowserCode;

import java.io.File;
import java.io.FileWriter;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;


public class Main {
static long lengthy;
static Thread worker;
static long sum;

private static long getLength() {
return Main.lengthy;
}

private static void setLength(long var) {
Main.lengthy=var;
}

private static long getFolderSize(File folder) {
long length=0;
File[] files = folder.listFiles();

int count = files.length;

for (int i = 0; i < count; i++) {
if (files[i].isFile()) {
length += files[i].length();
}
else {
length += getFolderSize(files[i],true);
}
}
System.out.println(folder+" // "+length);

return length;
}

private static long getFolderSize(File folder,boolean multiThreaded) {
if(multiThreaded) {
long length;
worker=new Thread(new Runnable() {
public void run() {

setLength(getFolderSize(folder));
}
});
worker.start();
try {
worker.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
length=getLength();
return length;

}else {
return getFolderSize(folder);
}
}


public static String convert_Bytes(long bytes,String prefered_Unit) {
prefered_Unit=prefered_Unit.toLowerCase().trim();
switch (prefered_Unit) {
case "b": return (bytes+" Bytes");
case "kb": return (bytes/1024+" Kilobytes");
case "mb": return (bytes/Math.pow(1024,2)+" Megabytes");
case "gb": return (bytes/Math.pow(1024,3)+" Gigabytes");
case "tb": return (bytes/Math.pow(1024,4)+" Terabytes");
default:System.out.println("Incorrect notation; Please use\nb\nkb\nmb\ngb\ntb");
System.exit(0);
return null;

}
}

public static String convert_Bytes(long bytes) {
double Kb=0;
double Mb=0;
double Gb=0;
double Tb=0;
String result;
if (bytes>=1024) {
Kb=bytes/1024;
bytes=0;
result=" Kilobytes";
if(Kb>=1024) {
Mb=Kb/1024;
Kb=0;
result=" Megabytes";
if(Mb>=1024) {
Gb=Mb/1024;
Mb=0;
result=" Gigabytes";
if(Gb>=1024) {
Tb=Gb/1024;
Gb=0;
result=" Terabyte";
}
}
}
}else {
result=" Bytes";
}
double sum=bytes+Mb+Gb+Tb;
return (sum+result);
}

public static void main(String[] args) {

String chosen_Folder =args[0];
String prefered_Unit;
String full_Size;
try {
prefered_Unit =args[1];
}catch (Exception e) {
prefered_Unit=null;
}

String local_Folder=System.getProperty("user.dir");
File full_Path;
String backslash ="\\";
String forwardslash="/";
String seperater;
if(System.getProperty("os.name").toLowerCase().indexOf("win")>=0) {
seperater=backslash;
}else {
seperater=forwardslash;
}
full_Path=new File(local_Folder+seperater+chosen_Folder);



System.out.println(full_Path);
long startTime =System.nanoTime();
if(prefered_Unit!=null) {
full_Size=convert_Bytes(getFolderSize(full_Path),prefered_Unit);

}else {
full_Size=convert_Bytes(getFolderSize(full_Path));
}
long endTime =System.nanoTime();

System.out.println("The size of "+chosen_Folder+" is: "+full_Size);
System.out.println("Took "+TimeUnit.NANOSECONDS.toSeconds(endTime-startTime)+" seconds to execute.");
File size_Indicator = new File(full_Path+seperater+"FileSize.txt");
try {
size_Indicator.createNewFile();
FileWriter writer = new FileWriter(size_Indicator);
writer.write(full_Size);
writer.close();
}catch(Exception e) {
System.err.println(e);
}

}

}

最佳答案

只是为了补充其他答案。

尽量避免使用

worker = new Thread(new Runnable() {
...
}

改用执行器。它们更容易使用、安排、运行和获取结果。另外,他们还负责线程池和其他开销。

阅读this .

执行器从 Java 5 开始就可用,它们是任何 JVM 不可或缺的一部分。

关于Java : How to implement Multi-Threading into a recursive folder size finder algorithm?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50802919/

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