zoukankan      html  css  js  c++  java
  • java多线程 之 BlockingQueue

    *

    本例子来自于Java核心技术卷一,14章多线程

    功能:指定一个目录,查找 包含 keyword 的内容

    有三个类:

    BlockingQueueTest:测试类

    FileEnumerationTask:将目录下的文件递归遍历到 BlockingQueue<File> 中

    SearchTask:从BlockingQueue<File> 逐个取出来,用scanner 读取

    代码:

    1,BlockingQueueTest.java

    package com.maple.blockingqueue;
    
    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) {
            String directory="e://testfile//";
            String keyword="aaa";
            
            final int FILE_QUEUE_SIZE=5;
            final int SEARCH_THREADS=10;
            BlockingQueue<File> queue=new ArrayBlockingQueue<>(FILE_QUEUE_SIZE);
            
            FileEnumerationTask enumerator=new FileEnumerationTask(queue,new File(directory));
            new Thread(enumerator).start();//将要查询的文件放到队列中
            for(int i=1;i<=SEARCH_THREADS;i++){
                System.out.println("start thread"+i);
                new Thread(new SearchTask(queue,keyword)).start();//从队列中取出文件来扫描
                
            }
        }
    }

    2,

    package com.maple.blockingqueue;
    
    import java.io.File;
    import java.util.concurrent.BlockingQueue;
    
    class FileEnumerationTask implements Runnable {
    
        public static File DUMMY=new File("");
        private BlockingQueue<File> queue;
        private File startingDirectory;
        
        
        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){
                
            }
            
        }
        public void enumerate(File directory) throws InterruptedException{
            File[] files=directory.listFiles();
            for(File file:files){
                if(file.isDirectory())
                    enumerate(file);
                else
                    queue.put(file);
            }
            
        }
    
    }

    3,

    package com.maple.blockingqueue;
    
    import java.io.File;
    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;
        }
    
    
        @Override
        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 | InterruptedException e){
                e.printStackTrace();
            }
        }
        
        public void search(File file) throws IOException{
            try(Scanner in=new Scanner(file)){
                int lineNumber=0;
                System.out.println("search file:"+file.getName());
                while(in.hasNextLine()){
                    lineNumber++;
                    String line=in.nextLine();
                    System.out.println(keyword+"$$$"+line);
                    if(line.contains(keyword))
                        System.out.printf("%s:%d:%s%n",file.getPath(),lineNumber,line);
                }
            }
        }
    
    }

    *

    有问题在公众号【清汤袭人】找我,时常冒出各种傻问题,然一通百通,其乐无穷,一起探讨


  • 相关阅读:
    Python面向对象5:类的常用魔术方法
    吴恩达机器学习笔记27-样本和直观理解2(Examples and Intuitions II)
    python之面向对象
    python之正则表达式
    python之模块
    python之函数
    python之基础
    python之入门
    Git+码云安装
    python,pycharm环境安装
  • 原文地址:https://www.cnblogs.com/qingmaple/p/6646084.html
Copyright © 2011-2022 走看看