《java核心技术》第八版14.6节使用阻塞队列的代码(生产者—消费者,根据关键字搜索文件内容)
2012-12-11 21:07
344 查看
package thread; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; public class TestBlockingQueue { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.print("输入初始目录:"); String dir = in.nextLine(); System.out.print("输入要查找的关键字:"); String keyword = in.nextLine(); final int QUEUE_SIZE = 100; final int THREAD_SIZE = 200; BlockingQueue<File> queue = new ArrayBlockingQueue<File>(QUEUE_SIZE); Thread enumeration = new Thread(new FileEnumerationTask(queue, new File(dir))); enumeration.start(); List<Thread> threadList = new ArrayList<Thread>(THREAD_SIZE); for (int n=0; n<THREAD_SIZE; ++n) { Thread thread = new Thread(new SearchTask(queue, keyword)); thread.start(); threadList.add(thread); } } } class FileEnumerationTask implements Runnable { private BlockingQueue<File> queue; private File startingDir; public static final File DUMMY = new File(""); // 构造器 public FileEnumerationTask(BlockingQueue<File> queue, File startingDir) { this.queue = queue; this.startingDir = startingDir; } // 执行枚举的逻辑 private void enumerate(File dir) throws InterruptedException { File[] files = dir.listFiles(); for (File file : files) { if (file.isDirectory()) { enumerate(file); } else { queue.put(file); // 如果队列满,就阻塞。在阻塞时,如果本线程被中断(interrupt),就会抛出“中断异常”。 } } } @Override public void run() { try { enumerate(this.startingDir); queue.put(DUMMY); } catch (InterruptedException e) { e.printStackTrace(); } } } class SearchTask implements Runnable { private BlockingQueue<File> queue; private String keyword; // 构造器 public SearchTask(BlockingQueue<File> queue, String keyword) { this.queue = queue; this.keyword = keyword; } private 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); } } } @Override public void run() { boolean done = false; try { while (!done) { File file = queue.take(); if (file == FileEnumerationTask.DUMMY) { queue.put(file); done = true; } else { search(file); } } } catch (InterruptedException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
相关文章推荐
- 如何使用阻塞队列查询文件内容中的关键字
- 使用阻塞队列解决生产者-消费者问题
- CoreJava_线程并发(阻塞队列):在某个文件夹下搜索含有某关键字的文件
- 使用阻塞队列实现生产者和消费者问题
- java中使用阻塞队列解决生产者消费者问题
- 基于Java阻塞队列实例(文件及文件内容搜索)
- linux下用grep命令根据文件内容进行关键字搜索[linux ubuntu grep] -转
- Java多线程之生产者消费者问题<三>:使用阻塞队列更优雅地解决生产者消费者问题
- 使用阻塞队列实现生产者-消费者模式——Java实现
- linux中根据文件内容关键字,搜索文件
- 什么是阻塞队列?如何使用阻塞队列来实现生产者-消费者模型?
- Java使用阻塞队列实现指定文件夹下面搜索指定关键字
- Java并发编程笔记 使用阻塞队列实现生产者-消费者模型
- Java阻塞队列BlockingQueue实现生产者消费者-只有代码-不讲原理
- 阻塞队列BlockingQueue实现生产者-消费者模式值桌面搜索
- 使用阻塞队列BlockingQueue实现生产者消费者
- Java使用阻塞队列BlockingQueue实现生产者消费者
- 什么是阻塞队列? 如何使用阻塞队列来实现生产者-消费者模型?
- 用阻塞队列(BlockingQueue)实现读写(生产者消费者)线程
- Python---对html文件内容进行搜索取出特定URL地址字符串,保存成列表,并使用每个url下载图片,并保存到硬盘上,使用bs4,beautifulsoup模块