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. strtok在keil中使用小笔记及字符串转换为多个浮点数的方法

    在pc上面使用这个字符串函数,是没有问题的,但是我在keil中结合rtos来处理字符串的时候,比如char *s = "1.01313;17.2609;17.4875";那么就只能 ...

  2. LeetCode 881. Boats to Save People

    原题链接在这里:https://leetcode.com/problems/boats-to-save-people/ 题目: The i-th person has weight people[i] ...

  3. Window IDEA开发工具 杀死指定端口 cmd 命令行 taskkill

    Windows平台   两步方法 :  1 查询端口占用,2 强行杀死进程 netstat -aon|findstr "8080" taskkill /pid 4136-t -f ...

  4. 如何把上传图片时候的文件对象转换为图片的url !

    getObjectURL(file) { var url = null; if (window.createObjectURL != undefined) { url = window.createO ...

  5. P4218 [CTSC2010]珠宝商

    P4218 [CTSC2010]珠宝商 神题... 可以想到点分治,细节不写了... (学了个新姿势,sam可以在前面加字符 但是一次点分治只能做到\(O(m)\),考虑\(\sqrt n\)点分治, ...

  6. 洛谷 P4568 [JLOI2011]飞行路线 题解

    P4568 [JLOI2011]飞行路线 题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在\(n\)个城市设有业务,设这些城市分别标记为\(0\)到\( ...

  7. TODO list(咕咕咕。。。

    1. Segment Tree Beats 2. ZR集训补题(还剩10题) 3. 尽可能将各种数据结构写得熟练...(某神仙:要把平衡树写得跟线段树一样熟练) 4. 树相关数据结构和算法(dsu o ...

  8. GoCN每日新闻(2019-10-09)

    GoCN每日新闻(2019-10-09) GoCN每日新闻(2019-10-09) 1. 我们如何将服务延迟减少了98% https://blog.gojekengineering.com/the-n ...

  9. gitlab备份恢复

    1.Gitlab 创建备份1.1 创建备份文件 首先我们得把老服务器上的Gitlab整体备份,使用Gitlab一键安装包安装Gitlab非常简单, 同样的备份恢复与迁移也非常简单. 使用一条命令即可创 ...

  10. hdoj - 1506 直方图中最大的矩形

    Problem Description A histogram is a polygon composed of a sequence of rectangles aligned at a commo ...