zoukankan      html  css  js  c++  java
  • phaser,开启三个线程分别搜索三个文件夹

    Phaser表示“阶段器”,用来解决控制多个线程分阶段共同完成任务的情景问题

    启动三个线程,分别对三个文件夹搜索,文件要以txt结尾,修改时间要在一天之内,并将文件路径打印在控制台

      

    /**
     * 开启三个线程对三个文件夹进行搜索
     *
     */
    public class FileSearch  implements Runnable {
        private String path;// 查找路径
        private String suffix;// 文件后缀
        private List<String> result;// 结果集
        private Phaser phaser;
    
        public FileSearch(String path, String end, Phaser phaser) {
            this.path = path;
            this.suffix = end;
            this.phaser = phaser;
            this.result = new ArrayList<String>();
        }
    
        private void directoryProcess(File file) {
            File list[] = file.listFiles();
            if (list != null) {
                for (File file2 : list) {
                    if (file2.isDirectory()) {
                        directoryProcess(file2);
                    } else {
                        fileProcess(file2);
                    }
                }
            }
        }
    
        private void fileProcess(File file) {
            if (file.getName().endsWith(suffix)) {
                result.add(file.getAbsolutePath());
            }
        }
    
        //只保留最近一天有过更改的文件
        private void filterResultLatest() {
            List<String> newResult = new ArrayList<String>();
            long actualDate = new Date().getTime();
            for (int i = 0; i < result.size(); i++) {
                File file = new File(result.get(i));
                long lastModifyTime = file.lastModified();
                if (actualDate - lastModifyTime < TimeUnit.MICROSECONDS.convert(1,
                        TimeUnit.DAYS)) {
                    newResult.add(result.get(i));
                }
            }
            result = newResult;
        }
    
        private boolean firstCheckResults() {
            if (result.isEmpty()) {
                System.out.println(Thread.currentThread().getName() + " 搜索完成    Phase =  "
                        + phaser.getPhase() + "  ,  result = 0 , 取消注册");
                phaser.arriveAndDeregister();
                return false;
            } else {
                System.out.println(Thread.currentThread().getName() + " 搜索完成    Phase =  "
                        + phaser.getPhase() + "  ,   result = " + result.size());
                phaser.arriveAndAwaitAdvance();
                return true;
            }
        }
    
        private boolean  secondCheckResults() {
            if (result.isEmpty()) {
                System.out.println(Thread.currentThread().getName() + " 经过对修改时间过滤后    Phase =  "
                        + phaser.getPhase() + " ,  result = 0 , 取消注册");
                phaser.arriveAndDeregister();
                return false;
            } else {
                System.out.println(Thread.currentThread().getName() + "  经过对修改时间过滤后     Phase =  "
                        + phaser.getPhase() + "  ,   result = " + result.size());
                phaser.arriveAndAwaitAdvance();
                return true;
            }
        }
        
        private void showInfo() {
            for (int i = 0; i < result.size(); i++) {
                System.out.println(Thread.currentThread().getName() + ":"
                        + result.get(i));
            }
            phaser.arriveAndAwaitAdvance();
        }
    
        @Override
        public void run() {
            phaser.arriveAndAwaitAdvance();
            System.out.println(Thread.currentThread().getName()+": starts");
            File file=new File(path);
            //将满足后缀结尾的文件的绝对路径放到results中
            if(file.isDirectory()){
                directoryProcess(file);
            }
    
            //第一次检查,假如result为空,当前线程从phaser中注销
            if(!firstCheckResults()){
                return;
            }
           //对搜索的结果过滤,只保留在最近一天修改过的文件
            filterResultLatest();
    
            //有可能在上一步中,本来有10个文件,但是更改时间都是超过一天的,经过上一步后,result为空了
            if(!secondCheckResults()){
                return;
            }
            //打印文件列表
            showInfo();
            //取消注册
            phaser.arriveAndDeregister();
        }
    
            public static void main(String[] args) {
                Phaser phaser = new Phaser(3);
                Thread t1 = new Thread(new FileSearch("C:\Users\PHP\Desktop\abc\a", "txt", phaser), "【线程一】");
                t1.start();
                Thread t2 = new Thread(new FileSearch("C:\Users\PHP\Desktop\abc\b", "txt", phaser), "【线程二】");
                t2.start();
                Thread t3 = new Thread(new FileSearch("C:\Users\PHP\Desktop\abc\c", "txt", phaser), "【线程三】");
                t3.start();
                try {
                    t1.join();
                    t2.join();
                    t3.join();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                System.out.println("Terminated:" + phaser.isTerminated());
            }
    
    }
  • 相关阅读:
    hive与hbase整合
    待重写
    hive DML
    【知识强化】第六章 总线 6.1 总线概述
    【知识强化】第五章 中央处理器 5.1 CPU的功能和基本结构
    【知识强化】第四章 指令系统 4.3 CISC和RISC的基本概念
    【知识强化】第四章 指令系统 4.2 指令寻址方式
    【知识强化】第四章 指令系统 4.1 指令格式
    【知识强化】第三章 存储系统 3.6 高速缓冲存储器
    【知识强化】第三章 存储系统 3.5 双口RAM和多模块存储器
  • 原文地址:https://www.cnblogs.com/moris5013/p/10895122.html
Copyright © 2011-2022 走看看