import java.io.File; import java.util.concurrent.BlockingQueue; public class FileEnumerationTask implements Runnable { private BlockingQueue<File> queue; private File startingDirectory; public static File DUMMY = new File(""); public FileEnumerationTask(BlockingQueue<File> queue,File startingDirectory){ this.queue=queue; this.startingDirectory=startingDirectory; } public void run() { try{ enumerate(startingDirectory); queue.put(DUMMY); }catch(InterruptedException e){ } } /* * 将目录下面的文件(非目录)加到阻塞队列中。这个函数是一个递归函数 * @directory起始目录 */ private void enumerate(File directory) throws InterruptedException { File[] files=directory.listFiles(); for(File f:files) if(f.isDirectory()) enumerate(f); else queue.put(f); } }
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Scanner; import java.util.concurrent.BlockingQueue; public class SearchTask implements Runnable{ private BlockingQueue<File> queue; private String keyword; public SearchTask(BlockingQueue<File> queue,String keyword){ this.queue=queue; this.keyword=keyword; } public void run() { try { boolean done = false; while (!done) { File file = queue.take(); if (file == FileEnumerationTask.DUMMY) { queue.put(file); done = true; } else search(file); } } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) {} } /* * 判断文件file中是否有有关健字keyword。 * @param file 搜索的文件 * 如果文件为目录,抛出FileNotFIndException */ public void search(File file) throws IOException { Scanner in = new Scanner(new FileInputStream(file)); int lineNumber = 0; while (in.hasNextLine()) { lineNumber++; String line = in.nextLine(); if (line.contains(keyword)) System.out.printf("%s:%d:%s%n", file.getPath(), lineNumber, line); } in.close(); } }
import java.io.File; import java.util.Scanner; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; public class BlockingQueueTest { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.print("Enter base directory (e.g. /usr/local/jdk5.0/src): "); String directory = in.nextLine(); System.out.print("Enter keyword (e.g. volatile): "); String keyword = in.nextLine(); final int FILE_QUEUE_SIZE = 10; final int SEARCH_THREADS = 100; BlockingQueue<File> queue = new ArrayBlockingQueue<File>(FILE_QUEUE_SIZE); FileEnumerationTask enumerator = new FileEnumerationTask(queue, new File(directory)); new Thread(enumerator).start(); for (int i = 1; i <= SEARCH_THREADS; i++) new Thread(new SearchTask(queue, keyword)).start(); } }