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()); } }