Java多线程搜索文件的代码示例,主要是使用Callable和Future,生成大量生命周期很短的线程,每个目录产生一个线程,可以使用一个线程池来运行任务,多个线程同时搜索文件,然后自动结束线程
package com.huawei.concurrent.thread;
import java.io.*;
import java.util.*;
import java.util.concurrent.*;
public class FileSearch implements Callable<List<File>>{
private File directory;
private FilenameFilter filter;
public FileSearch(File directory, FilenameFilter filter)
{
super();
this.directory = directory;
this.filter = filter;
}
@Override
public List<File> call() throws Exception {
List<File> list = new ArrayList<File>();
File[] files = directory.listFiles();
ArrayList<Future<List<File>>> results = new ArrayList<Future<List<File>>>();
for(File file : files)
{
if(file.isDirectory())
{
System.out.println("1111111111111:"+file.getParentFile()+"1111111111111111111111:"+file.getPath());
Callable<List<File>> runnable = new FileSearch(file,filter);
FutureTask<List<File>> task = new FutureTask<List<File>>(runnable);
results.add(task);
Thread t = new Thread(task);
t.start();
}
else if (filter.accept(file.getParentFile(), file.getName()))
{
System.out.println("父目录路径:"+file.getParentFile()+"包子:"+file.getPath());
list.add(file);
}
}
for (Future<List<File>> result : results) {
list.addAll(result.get());
}
return list;
}
public static void main(String[] args) throws Exception
{
File dir = new File("d:"+File.separator+"work"+File.separator+"test");
FileSearch search = new FileSearch(dir,new FilenameFilter()
{
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".java");
}
});
FutureTask<List<File>> task = new FutureTask<List<File>>(search);
Thread t = new Thread(task);
t.start();
for(File f: task.get())
{
System.out.println(f.getPath());
System.out.println(f.getName());
}
}
}