phaser

来源:互联网 发布:淘宝汽车配件保证金 编辑:程序博客网 时间:2024/06/05 02:15

创建三个线程在三个目录里查找一天以内修改过的以log结尾的文件并打印出来,
线程与线程之间通过phaser来保持同步点

package com.brendan.cn.concurrent.phaser;import java.io.File;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.concurrent.Phaser;import java.util.concurrent.TimeUnit;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);                }            }        }    }    //将每个以end结尾的文件的绝对路径加入result集合里    private void fileProcess(File file) {        if (file.getName().endsWith(end)) {            results.add(file.getAbsolutePath());        }    }    //过滤result中的文件集合,找出在一天以内修改过的文件并返回    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 checkResults() {        if (results.isEmpty()) {            System.out.println(Thread.currentThread().getName() + ": Phase "                    + phaser.getPhase() + " 0 result");            System.out.println(Thread.currentThread().getName() + ": Phase "                    + phaser.getPhase() + " end");            phaser.arriveAndDeregister();            return false;        } else {            System.out.println(Thread.currentThread().getName() + ": Phase "                    + phaser.getPhase() + " " + results.size() + " result");            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()+": Starting");        File file=new File(initPath);        if(file.isDirectory()){            direactoryProcess(file);        }        if(!checkResults()){            return;        }        filterResult();        if(!checkResults()){            return;        }        showInfo();        phaser.arriveAndDeregister();        System.out.println(Thread.currentThread().getName()+": Work completed");    }}
package com.brendan.cn.concurrent.phaser;import java.util.concurrent.Phaser;public class PhaserMain {public static void main(String[] args) {    Phaser phaser=new Phaser(3);    FileSearch system=new FileSearch("E:\\aa", "log", phaser);    FileSearch apps=new FileSearch("E:\\bb", "log", phaser);    FileSearch documents=new FileSearch("E:\\cc", "log", phaser);    Thread systemThread=new Thread(system, "system");    systemThread.start();    Thread appsThread=new Thread(apps, "apps");    appsThread.start();    Thread documentsThread=new Thread(documents, "documents");    documentsThread.start();    try {        systemThread.join();        appsThread.join();        documentsThread.join();    } catch (Exception e) {        e.printStackTrace();    }    System.out.println("Terminated:"+ phaser.isTerminated());}}

转载自
http://blog.csdn.net/junshuaizhang/article/details/39933717

原创粉丝点击