phaser的使用

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

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

public class FileSearch implements Runnable {
    private String initPath;// 查找路径
    private String end;// 文件后缀
    private List<String> results;// 结果集
    private Phaser phaser;

    public FileSearch(String initPath, String end, Phaser phaser) {
        this.initPath = initPath;
        this.end = end;
        this.phaser = phaser;
        this.results = new ArrayList<String>();
    }

    private void direactoryProcess(File file) {
        File list[] = file.listFiles();
        if (list != null) {
            for (File file2 : list) {
                if (file2.isDirectory()) {
                    direactoryProcess(file2);
                } else {
                    fileProcess(file2);
                }
            }
        }
    }

    private void fileProcess(File file) {
        if (file.getName().endsWith(end)) {
            results.add(file.getAbsolutePath());
        }
    }

    private void filterResult() {
        List<String> newResult = new ArrayList<String>();
        long actualDate = new Date().getTime();
        for (int i = 0; i < results.size(); i++) {
            File file = new File(results.get(i));
            long lastModifyTime = file.lastModified();
            if (actualDate - lastModifyTime < TimeUnit.MICROSECONDS.convert(1,
                    TimeUnit.DAYS)) {
                newResult.add(results.get(i));
            }
        }
        results = newResult;
    }

    private boolean firstCheckResults() {
        if (results.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 = " + results.size());
            phaser.arriveAndAwaitAdvance();
            return true;
        }
    }

    private boolean  secondCheckResults() {
        if (results.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 = " + results.size());
            phaser.arriveAndAwaitAdvance();
            return true;
        }
    }
    
    private void showInfo() {
        for (int i = 0; i < results.size(); i++) {
            System.out.println(Thread.currentThread().getName() + ":"
                    + results.get(i));
        }
        phaser.arriveAndAwaitAdvance();
    }

    @Override
    public void run() {
        phaser.arriveAndAwaitAdvance();
        System.out.println(Thread.currentThread().getName()+": starts");
        File file=new File(initPath);
        //将满足后缀结尾的文件的绝对路径放到results中
        if(file.isDirectory()){
            direactoryProcess(file);
        }
        //第一次检查
        if(!firstCheckResults()){
            return;
        }
       //对搜索的结果过滤,只保留在最近一天修改过的文件
        filterResult();
        //第二次检查
        if(!secondCheckResults()){
            return;
        }
        //打印文件列表
        showInfo();
        //取消注册
        phaser.arriveAndDeregister();
    }
}
public class  Client {
    public static void main(String[] args) {
        Phaser phaser = new Phaser(3);
        Thread t1 = new Thread(new FileSearch("C:\\Users\\PHP\\Desktop\\desk\\aa", "txt", phaser), "【线程一】");
        t1.start();
        Thread t2 = new Thread(new FileSearch("C:\\Users\\PHP\\Desktop\\desk\\bb", "txt", phaser), "【线程二】");
        t2.start();
        Thread t3 = new Thread(new FileSearch("C:\\Users\\PHP\\Desktop\\desk\\cc", "txt", phaser), "【线程三】");
        t3.start();
        try {
            t1.join();
            t2.join();
            t3.join();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("Terminated:" + phaser.isTerminated());
    }
}

猜你喜欢

转载自www.cnblogs.com/moris5013/p/10895122.html
今日推荐