JAVA 队列【学习】

来源:互联网 发布:originlab mac 破解 编辑:程序博客网 时间:2024/05/16 07:01

声明:仅作为学习,侵权必删
一、队列概述

二、队列应用场景

三、实例代码

该代码来自中[博客园](http://www.cnblogs.com/end/archive/2012/10/25/2738493.html)
public class QueneTest {    public static void main(String[] args) {        String diretory = "D:\\个人" ;//in.nextLine();        String keyword = "添加";        final  int FILE_QUEUE_SIZE = 10;        final  int SEARCH_THREADS = 100;        long startTime = System.currentTimeMillis();        BlockingQueue<File> queue = new ArrayBlockingQueue<File>(FILE_QUEUE_SIZE);        FileEnumerationTask enumerationTask = new FileEnumerationTask(queue,new File(diretory));        new Thread(enumerationTask).start();        for ( int i =1; i<100 ;i++){            new Thread(new SearchTask(queue,keyword)).start();        }        long endTime = System.currentTimeMillis();        System.out.printf("speed Time is %s",(endTime-startTime));    }    static class   FileEnumerationTask implements Runnable {        public static   final  File EMPTRY = new File("");        private BlockingQueue<File> queue;        private File staringDirectory;        public FileEnumerationTask(BlockingQueue<File> queue,File staringDirectory){            this.queue = queue;            this.staringDirectory = staringDirectory;        }        @Override        public void  run(){            try {                enumerate(staringDirectory);                queue.put(EMPTRY);            }catch (InterruptedException ex){                ex.printStackTrace();            }        }        public void enumerate(File diretory) throws  InterruptedException {            File[] files = diretory.listFiles();            for (File file: files ) {                if(file.isDirectory()){                    enumerate(file);                }else{                    queue.put(file);                }            }        }    }    static 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.EMPTRY) {                        queue.put(file);                        done = true;                    } else {                        search(file);                    }                }            }catch (Exception ex){                ex.printStackTrace();            }        }        public void search(File file) throws IOException {            BufferedReader bufferedReader=  new BufferedReader(new FileReader(file));            int lineNumber = 0 ;          String lineData = null ;          while( (lineData = bufferedReader.readLine())!= null){              lineNumber++;              if(lineData.contains(keyword)){                  System.out.printf("%s:%d:%s%n",file.getPath(),lineNumber,lineData);              }            }            bufferedReader.close();        }    }}

总结:定义定长的数组队列,遍历文件到队列中去,通过空文件作为最终遍历后的标示符,开启多个线程,从队列中获取文件,各个线程分别搜索各自拿到文件中是否存在要搜索的关键字。

0 0
原创粉丝点击