public class BlockingQueueTest {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.printf("Enter base directory(e.g. /usr/local/jdk5.0/src):");
String directory = in.nextLine();
System.out.print("Enter keyword(e.g volatile):");
String keywords = 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, keywords)).start();
}
}
}
/**
* 这个任务枚举所有目录中的文件及其子目录
*/
public class FileEnumerationTask implements Runnable{
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) {
}
}
/**
* 递归地列举了在一个给定的的目录中的所有文件和其子目录
* @param directory 开始目录
* @throws InterruptedException
*/
public void enumerate(File directory) throws InterruptedException {
File[] files = directory.listFiles();
for (File file : files) {
if (file.isDirectory()) {
enumerate(file);
} else {
queue.put(file);
}
}
}
public static File DUMMY = new File("");
private BlockingQueue<File> queue;
private File startingDirectory;
}
/**
* 这个任务对于一个给定的关键字搜索文件
*/
public class SearchTask implements Runnable {
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) {
e.printStackTrace();
}
}
/**
* 搜索特定关键字的文件和打印所有匹配的行
* @param file
* @throws IOException
*/
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();
}
private BlockingQueue<File> queue;
private String keyword;
}
分享到:
相关推荐
java中,常用的阻塞式队列Demo。包含:ArrayBlockingQueue、LinkedQueue、PriorityBlockingQueue
支持多线程的阻塞队列,使用模板技术,可存储任意类型数据
讲述线程池原理,线程池使用场景和注意事项,手动创建线程池方法,注意事项,阻塞队列的相关知识
实现java模拟阻塞队列的例子,该代码包括,阻塞队列实现生产者,消费者。和模拟阻塞队列实现生产者及消费者模式,帮助你更好的理解java多线程
并发-线程池和阻塞队列 并发-线程池和阻塞队列 并发-线程池和阻塞队列
Linux下支持阻塞操作的字符设备驱动Linux下支持阻塞操作的字符设备驱动Linux下支持阻塞操作的字符设备驱动Linux下支持阻塞操作的字符设备驱动Linux下支持阻塞操作的字符设备驱动Linux下支持阻塞操作的字符设备驱动...
Java实现简单的阻塞队列2种方式,1使用wait(),notify();2使用countdownlatch实现
PI解决队列堵塞问题
14-阻塞队列BlockingQueue实战及其原理分析二.pdf
在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了Dequeue接口)。 使用非阻塞队列的时候有一个很大问题是:它不会对当前线程产生阻塞,那么在面对类似...
没有网络的时候,将操作产生的本地图片(拍照,也可能是其他文件),存储起来。有网络的时候传输到文件服务器。 文件服务器只支持一个文件一个文件的传输。
阻塞队列详解
并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
主要介绍了剖析Java中阻塞队列的实现原理及应用场景,这里也对阻塞和非阻塞队列的不同之处进行了对比,需要的朋友可以参考下
c_c++阻塞队列的代码
实现思路:导入相关工作模块->通过对话框形式选择待打印文件的文件夹->自定义打印机空闲检查函数和打印函数->依次取出文件夹中的文件并在打印机空闲时打印。 注意事项:此代码运行需要网络中有正常可用的打印机,...
可中断式非阻塞循环队列代码,C语言 可在中断中入队,在主循环中出队 使用stm32单片机作为测试平台 入队出队无冲突问题,测试稳定 两种模式选择 消息队列与任务队列 实现的效果有很大不同 设计巧妙,值得思考
实现了一个多线程安全的循环队列,并能以阻塞方式出队,提供效率,
阻塞队列是多线程中常用的数据结构,对于实现多线程之间的数据交换、同步等有很大作用。 阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。简而言之,阻塞队列...
c++11 实现的阻塞队列