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 = ; i < result.size(); i++) {
File file = new File(result.get(i));
long lastModifyTime = file.lastModified();
if (actualDate - lastModifyTime < TimeUnit.MICROSECONDS.convert(,
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 = ; 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();
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());
} }

phaser,开启三个线程分别搜索三个文件夹的更多相关文章

  1. 编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。如:ABCABCABC…… 依次递归

    import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.uti ...

  2. Lichee(三) Android4.0该产品的目标文件夹,Lichee链接---extract-bsp

    由<Lichee() 在sun4i_crane平台下的编译>介绍了编译lichee的基本情况,我们终于得到了编译后的结果例如以下: out/ ├── android │   ├── bIm ...

  3. sublime 搜索时忽略文件夹

    如上图:添加 "folder_exclude_patterns": ["要忽略的文件夹"]

  4. java实现基于关键字的文件夹(文件)的搜索、文件夹(文件)的复制、删除

    最近在做一个项目,需要实现这几项功能,上网查了很多资料,自己研究了好几天终于实现了,现在与大家分享一下. 一.JAVA实现文件夹的搜索   在百度搜索N个技术文章,从哪些大牛们共享的资料中终于写出了我 ...

  5. Windbg 进程与线程 《第三篇》

    Windbg既可以显示进程和线程列表,又可以显示指定进程或线程的详细信息.调试命令可以提供比taskmgr更详尽的进程资料,在调试过程中不可或缺. 一.进程命令 进程命令包括这些内容:显示进程列表.进 ...

  6. java中使用ReentrantLock锁中的Condition实现三个线程之间通信,交替输出信息

    本文直接附上源代码,如下是自己写的一个例子 面试题需求: 使用Condition来实现 三个线程 线程1 线程2 线程3 三个交替输出 [按照 线程1(main)-->线程2-->线程3] ...

  7. java面试记录二:spring加载流程、springmvc请求流程、spring事务失效、synchronized和volatile、JMM和JVM模型、二分查找的实现、垃圾收集器、控制台顺序打印ABC的三种线程实现

    注:部分答案引用网络文章 简答题 1.Spring项目启动后的加载流程 (1)使用spring框架的web项目,在tomcat下,是根据web.xml来启动的.web.xml中负责配置启动spring ...

  8. windows:shellcode 远程线程hook/注入(三)

    今天介绍第三种远程执行shellcode的思路:函数回调: 1.所谓回调,简单理解: windows出厂时,内部有很多事务的处理无法固化(无法100%预料外部会遇到哪些情况),只能留下一堆的接口,让开 ...

  9. 使用Java 多线程编程 让三个线程轮流输出ABC,循环10次后结束

    简要分析: 要求三个线程轮流输出,这里我们要使用一个对象锁,让关键部分的代码放入同步块当中.同时要有一个变量记录打印的次数到达10次循环后不再打印,另外一个就是要给每个线程一个标志号,我们根据标识号来 ...

随机推荐

  1. SpringMVC_原理(转)

    在整个Spring MVC框架中,DispatcherServlet处于核心位置,它负责协调和组织不同组件完成请求处理并返回响应的工作.具体流程为:1)客户端发送http请求,web应用服务器接收到这 ...

  2. BM算法【实数模板】

    BM递推杜教版是在整数取模的情况下的, 这个可以求解实数系数,但是可能有精度误差. 若一个问题的结论是通过推线性递推式来解,考虑到实际的情况,可以用BM算法的模板,先输入项数再依次输入项,项越多越准确 ...

  3. 委托、Lamda表达式

    1.委托概述 2.匿名方法 3.语句Lambda 4.表达式Lambda 5.表达式树

  4. 洛谷 P2422 良好的感觉 题解

    P2422 良好的感觉 题目描述 kkk做了一个人体感觉分析器.每一天,人都有一个感受值Ai,Ai越大,表示人感觉越舒适.在一段时间[i, j]内,人的舒适程度定义为[i, j]中最不舒服的那一天的感 ...

  5. Tex家族关系

    小书匠 声明:文章自一份其实很短的 LaTeX 入门文档学习,整理所得. Tex家族关系 Tex家族关系图 1.排版引擎 1.所谓的引擎,是指能够实现断行.分页等操作的程序(请注意这并不是定义) 2. ...

  6. 修改elementUI源码新增组件/修改组件

    前言 经常我们会遇到elementUI组件库期间有5%达不到我们想要的需求,第一我们重新写组件,第二我们改源码 安装element https://github.com/ElemeFE/element ...

  7. 可分离卷积详解及计算量 Basic Introduction to Separable Convolutions

    任何看过MobileNet架构的人都会遇到可分离卷积(separable convolutions)这个概念.但什么是“可分离卷积”,它与标准的卷积又有什么区别?可分离卷积主要有两种类型: 空间可分离 ...

  8. 全面解读Group Normalization,对比BN,LN,IN

    前言 Face book AI research(FAIR)吴育昕-何恺明联合推出重磅新作Group Normalization(GN),提出使用Group Normalization 替代深度学习里 ...

  9. Linux系统学习(二)一Linux基本操作

    一.Linux的目录结构 1.1 Linux的目录结构图 1.2 目录内容 /:这就是根目录.对你的电脑来说,有且只有一个根目录.所有的东西,我是说所有的东西都是从这里开始.举个例子:当你在终端里输入 ...

  10. 面试问我 Java 逃逸分析,瞬间被秒杀了。。

    记得几年前有一次栈长去面试,问到了这么一个问题: Java中的对象都是在堆中分配吗?说明为什么! 当时我被问得一脸蒙逼,瞬间被秒杀得体无完肤,当时我压根就不知道他在考什么知识点,难道对象不是在堆中分配 ...