用Callable和Future实现多线程文件搜索

来源:互联网 发布:网络上刷信誉是真的吗 编辑:程序博客网 时间:2024/05/16 13:04
package com.test.io;import java.io.File;import java.io.FilenameFilter;import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.List;import java.util.concurrent.Callable;import java.util.concurrent.Future;import java.util.concurrent.FutureTask;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;}public static void main(String[] args) throws Exception {File dir = new File("E:\\workspace\\Test");FileSearch search = new FileSearch(dir, new FilenameFilter() {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());}}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 f : files) {if (f.isDirectory()) {Callable<List<File>> runnable = new FileSearch(f, filter);FutureTask<List<File>> task = new FutureTask<List<File>>(runnable);results.add(task);Thread t = new Thread(task);t.start();} else if (filter.accept(f.getParentFile(), f.getName())) {list.add(f);}}for (Future<List<File>> result : results) {list.addAll(result.get());}return list;}}

改进:这个程序产生了大量生命周期很短的线程,每个目录产生一个线程,可以使用一个线程池来运行任务。
原创粉丝点击