`
AAries
  • 浏览: 39738 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

阻塞队列例子(实现指定目录下查找包含关键字的文件)

 
阅读更多
/*
 * 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();
    }
    
}

分享到:
评论

相关推荐

    java学习(基于Java阻塞队列的搜索实例).pdf

    搜索任务则从队列中取出文件,并查找其中是否包含指定的关键字。 具体到代码实现,首先通过`Scanner`类获取用户输入的基本目录和搜索关键字。然后初始化一个`ArrayBlockingQueue`,队列大小为10。接着,创建一个`...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例141 使用阻塞队列实现线程同步 183 实例142 新建有返回值的线程 184 实例143 使用线程池优化多线程编程 186 实例144 Object类中线程相关的方法 187 实例145 哲学家就餐问题 189 实例146 使用信号量实现线程同步 ...

    python100例

    "Python100例"是一个集合了100个Python编程练习的例子,旨在帮助初学者更好地理解和掌握Python语言的基础及进阶用法。这个资源涵盖了从基础语法到更复杂的编程概念,通过实例来引导学习者逐步提升编程技能。 1. **...

    张孝祥正在整理Java就业面试题大全

    4. NIO:非阻塞IO模型,选择器Selector,通道Channel,缓冲区Buffer,以及文件系统路径的Path API。 五、反射与注解 1. 反射:Class类的使用,以及动态创建对象、获取和修改字段、方法等。 2. 注解:自定义注解、元...

    02365全国计算机软件基础(二)某.4-某.7所有简答题总汇.pdf

    18. **文件**:文件是存储在计算机存储媒介上,逻辑上具有完整意义的一组相关信息的有序集合,可以包含文本、图像、音频、视频等多种类型的数据。 19. **外模式**:外模式是数据库系统中用户看到的数据视图,是用户...

    JAVA 面试 问题和答案

    首先,文件内容分为多个主要部分,包括面向对象编程、Java基础问题、Java线程、Java集合框架等,下面将分别对每个部分的知识点进行详细阐述。 面向对象编程(OOP): 1.1 封装(Encapsulation):封装是面向对象编程的一...

    大厂面试系列二.pdf

    常用的Linux命令包括ls列出目录内容、cd切换目录、pwd显示当前目录路径、cp复制文件或目录、mv移动或重命名文件、rm删除文件或目录、mkdir创建新目录、rmdir删除目录、touch创建空文件或修改文件时间戳等。...

    Java 最常见 200+ 面试题全解析:面试必备.docx

    - 线程的生命周期包括新建状态、就绪状态、运行状态、阻塞状态和终止状态。 - 线程间的通信机制涉及同步机制(synchronized 关键字)、volatile 关键字以及并发工具类(如 `ReentrantLock` 和 `Semaphore`)等。 ##...

    共享内存临界资源控制

    在管道和消息队列的场景中,发送方会在缓冲区满时被阻塞,接收方则在缓冲区为空时被阻塞,这种机制在一定程度上避免了并发访问的冲突。然而,对于需要更精细控制的互斥操作,如禁止两个以上进程同时操作同一资源,就...

    2010年全国计算机考研统考试题与解答

    ### 2010年全国计算机考研统考试题与解答 ...这一题的选项未能完整给出,常见的总线标准包括PCI(Peripheral Component Interconnect)、AGP(Accelerated Graphics Port)、ISA(Industry Standard Architecture)等。

    JS 异步编程与Promise async await语法糖

    当一个任务完成后,JavaScript会去任务队列中查找下一个任务,这种机制被称为事件循环。 Promise是JavaScript中处理异步操作的重要工具,它代表了一个可能尚未完成的异步操作的结果。Promise有三种状态:pending...

    javaSE代码实例

    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 ...

Global site tag (gtag.js) - Google Analytics