Ich entwickle ein einfaches Suchwerkzeug für meinen Zweck. Meine Absicht ist es, alle Dateien oder bestimmte Dateien im angegebenen Ordner zu durchsuchen. Ich dachte, mit mehreren Threads zu tun. Jeder Thread beginnt mit der Suche nach einer Datei und fügt diese Datei in eine Liste ein, wenn diese Datei nicht in der Liste enthalten ist. So wird jeder Thread nicht nach der gleichen Datei suchen.Suche nach einer Datei mit mehreren Threads
Ich bin mir nicht sicher, ob das der richtige Ansatz ist oder nicht. Und wenn ich das Programm ausführen, könnte ich das gleiche Ergebnis sehen, wenn ich einen Thread, zwei und sogar mehr als zwei verwenden.
Dann habe ich Executor Service, immer noch bekomme ich die gleiche Ausführungszeit.Ich konnte nicht den Unterschied finden. Meine Fragen sind unten.
1.Am ich benutze richtige Logik für die Suche Datei mit mehreren Threads?
2. kann ich den Unterschied bei der Ausführung mit einem Thread, zwei Threads, etc?
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class FileReaderRunnable implements Runnable {
private List<File> fileList = new ArrayList<>();
private File mfile;
public boolean finished;
public FileReaderRunnable(File file) {
this.mfile = file;
}
@Override
public void run() {
//System.out.println("Thread current:"+Thread.currentThread().getName());
//while(!finished){
getfiles(mfile);
//finished = false;
//}
}
public void setFlag(boolean value) {
finished = value;
}
public void getfiles(File file) {
System.out.println("EXecuting...: "+Thread.currentThread().getName()+file.getAbsolutePath());
File[] listFiles = file.listFiles();
if (listFiles != null && listFiles.length > 0) {
for (File file2 : listFiles) {
if(!fileList.contains(file2.getAbsoluteFile())){
fileList.add(file2.getAbsoluteFile());
}
getfiles(file2);
}
}
}
public List<File> getFiles(){
return fileList ;
}
}
public class FileReaderThreadMain {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(30);
File file = new File("C:\\Temp");
FileReaderRunnable r = new FileReaderRunnable(file);
long startTime = System.nanoTime();
executor.execute(r);
executor.shutdown();
// Wait until all threads are finish
while (!executor.isTerminated()) {
}
long endTime = System.nanoTime();
System.out.println("\nFinished all threads");
System.out.println("main thread exited");
List<File> files = r.getFiles();
System.out.println("Total Files size: "+files.size());
long duration = (endTime - startTime);
System.out.println("Duration: "+duration/1000000);
}
}
Es scheint, dass es nur ein Thread ist, nicht wahr? –
Sie haben nur eine Instanz von 'FileReaderRunnable', so dass es nur einen Worker gibt. Versuchen Sie, einige Instanzen davon zu erstellen, um "Executor" –
zu liefern. Gibt es einen bestimmten Grund, warum Sie thread dafür verwenden? –