/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package blockingqueuetest;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
*
* @author Administrator
*/
public class BlockingQueueTest {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("Enter the base directory (e.g. /usr/local/jdk1.6.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_THREADES = 100;
BlockingQueue<File> queue = new ArrayBlockingQueue<File>(FILE_QUEUE_SIZE);
//创建一个带有给定的(固定)容量和默认访问策略的 ArrayBlockingQueue
FileEnumerationTask enumerator = new FileEnumerationTask(queue, new File(directory));
new Thread(enumerator).start(); //该线程负责在指定目录下将所有文件加入阻塞队列
for(int i = 1; i <= SEARCH_THREADES; i++)
{
new Thread(new SearchTask(queue, keyword)).start(); //该线程用来搜索指定文件是否包含关键字
System.out.print(queue.size() + " ");
}
}
}
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;
}
@Override
public void run() {
try
{
enumerate(startingDirectory);
queue.put(DUMMY);
}
catch(InterruptedException e)
{
}
}
/*
* 该函数的功能是遍历某个目录下(包括子目录)的文件,并将其加入到BlockingQueue中
*
**/
private void enumerate(File directory) throws InterruptedException
{
File[] files = directory.listFiles();
for(File f: files)
{
if(f.isDirectory())
enumerate(f);
else
queue.put(f);
}
}
}
/*
* SearchTask的功能是提供一个方法,搜索指定目录下包含指定关键字的文件。
*/
class SearchTask implements Runnable
{
private BlockingQueue<File> queue;
private String keyword;
public SearchTask(BlockingQueue<File> queue, String keyword) {
this.queue = queue;
this.keyword = keyword;
}
@Override
public void run() {
try {
boolean done = false;
while (!done) {
File file = queue.take();
if (file == FileEnumerationTask.DUMMY) {
queue.put(file);
done = true;
} else {
try {
search(file);
} catch (FileNotFoundException ex) {
}
}
}
} // catch(IOException e)
// {
// e.printStackTrace();
// }
catch (InterruptedException e)
{
}
}
private void search(File file) throws FileNotFoundException {
Scanner in = new Scanner(new FileInputStream(file));
int lineNumber = 0;
while(in.hasNext())
{
lineNumber++;
String line = in.nextLine();
if(line.contains(keyword))
System.out.printf("%s:%d:%s%n", file.getPath(), lineNumber, line);
}
in.close();
}
}
分享到:
相关推荐
搜索任务则从队列中取出文件,并查找其中是否包含指定的关键字。 具体到代码实现,首先通过`Scanner`类获取用户输入的基本目录和搜索关键字。然后初始化一个`ArrayBlockingQueue`,队列大小为10。接着,创建一个`...
实例141 使用阻塞队列实现线程同步 183 实例142 新建有返回值的线程 184 实例143 使用线程池优化多线程编程 186 实例144 Object类中线程相关的方法 187 实例145 哲学家就餐问题 189 实例146 使用信号量实现线程同步 ...
"Python100例"是一个集合了100个Python编程练习的例子,旨在帮助初学者更好地理解和掌握Python语言的基础及进阶用法。这个资源涵盖了从基础语法到更复杂的编程概念,通过实例来引导学习者逐步提升编程技能。 1. **...
4. NIO:非阻塞IO模型,选择器Selector,通道Channel,缓冲区Buffer,以及文件系统路径的Path API。 五、反射与注解 1. 反射:Class类的使用,以及动态创建对象、获取和修改字段、方法等。 2. 注解:自定义注解、元...
18. **文件**:文件是存储在计算机存储媒介上,逻辑上具有完整意义的一组相关信息的有序集合,可以包含文本、图像、音频、视频等多种类型的数据。 19. **外模式**:外模式是数据库系统中用户看到的数据视图,是用户...
首先,文件内容分为多个主要部分,包括面向对象编程、Java基础问题、Java线程、Java集合框架等,下面将分别对每个部分的知识点进行详细阐述。 面向对象编程(OOP): 1.1 封装(Encapsulation):封装是面向对象编程的一...
常用的Linux命令包括ls列出目录内容、cd切换目录、pwd显示当前目录路径、cp复制文件或目录、mv移动或重命名文件、rm删除文件或目录、mkdir创建新目录、rmdir删除目录、touch创建空文件或修改文件时间戳等。...
- 线程的生命周期包括新建状态、就绪状态、运行状态、阻塞状态和终止状态。 - 线程间的通信机制涉及同步机制(synchronized 关键字)、volatile 关键字以及并发工具类(如 `ReentrantLock` 和 `Semaphore`)等。 ##...
在管道和消息队列的场景中,发送方会在缓冲区满时被阻塞,接收方则在缓冲区为空时被阻塞,这种机制在一定程度上避免了并发访问的冲突。然而,对于需要更精细控制的互斥操作,如禁止两个以上进程同时操作同一资源,就...
### 2010年全国计算机考研统考试题与解答 ...这一题的选项未能完整给出,常见的总线标准包括PCI(Peripheral Component Interconnect)、AGP(Accelerated Graphics Port)、ISA(Industry Standard Architecture)等。
当一个任务完成后,JavaScript会去任务队列中查找下一个任务,这种机制被称为事件循环。 Promise是JavaScript中处理异步操作的重要工具,它代表了一个可能尚未完成的异步操作的结果。Promise有三种状态:pending...
1.2.3 安装后Java目录的解读 7 1.3 学会使用API 7 1.4 第一个Java程序 8 1.4.1 开发源代码 8 1.4.2 编译运行 9 1.5 小结 11 第2章 基本数据类型——构建Java 大厦的基础 12 2.1 源代码注释 12 ...