【发布时间】:2016-08-02 10:19:34
【问题描述】:
我正在为我的目的开发一个简单的搜索工具。 我的意图是搜索指定文件夹下的所有文件或特定文件。 我想用多个线程来做。 每个线程将开始搜索文件并将该文件放入列表中,如果该文件 不包含在列表中。 所以每个线程不会扫描同一个文件。
我不确定这是不是正确的方法。 当我运行程序时,当我使用一个线程时,我可以看到相同的结果,两个 甚至不止两个。
然后我使用了 Executor 服务,我仍然得到相同的执行时间。我不能 找到不同之处。我的问题如下。
1.我是否使用正确的逻辑来搜索多线程文件?
2.用一个线程,两个线程等执行时,我能得到区别吗?
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 );
}
}
【问题讨论】:
-
好像只有一个线程吧?
-
你只有一个
FileReaderRunnable的实例,所以只有一个工人。尝试创建它的几个实例以提供给executor -
您为此使用线程是否有某些特定原因?
-
除非您在多个物理文件系统中进行搜索,否则您可能不会发现使代码并行的任何优势,因为所有请求都将转到同一个文件系统,该文件系统将一一处理它们.
-
如果您正在搜索单个硬盘驱动器,多个线程可能会大大减慢该过程。一个线程将硬盘寻道到一个位置并读取,然后下一个线程将硬盘寻道到另一个位置并读取,等等。所有的寻道都是不必要的,对一个驱动程序的单线程调用集可以在一定程度上优化了查找和读取。只是把东西放在多个线程中不仅不会让事情变得更快,有时还会让它们变慢。
标签: java multithreading