phaser

创建三个线程在三个目录里查找一天以内修改过的以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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值