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. Centos7安装使用Mysql(mariadb)

    安装 shell> yum install mariadb-server -y 配置 # 修改文件 /etc/my.cnf [mysqld]datadir=/mydata/data/mysqlc ...

  2. 利用GitHub+Node.js+Hexo搭建个人博客

    本篇是自己在搭建Hexo博客平台时的一个过程记录.(2019.9.13实测有效) GitHub 账号注册 因为此文所搭建的个人博客是基于GitHub平台服务的,所以首先是注册GitHub,当然已有账号 ...

  3. LeetCode 1087. Brace Expansion

    原题链接在这里:https://leetcode.com/problems/brace-expansion/ 题目: A string S represents a list of words. Ea ...

  4. BZOJ 1758: [Wc2010]重建计划 01分数规划+点分治+单调队列

    code: #include <bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in", ...

  5. vuex 之既生‘mutation’何生‘action’

    vuex 中,action 及 mutation 均为操作数据的作用而存在,既然二者均可改变数据,为什么要分成两个方法来处理呢,因为: Mutation 必须是同步函数 mutations: { so ...

  6. 47、Spark SQL核心源码深度剖析(DataFrame lazy特性、Optimizer优化策略等)

    一.源码分析 1. ###入口org.apache.spark.sql/SQLContext.scala sql()方法: /** * 使用Spark执行一条SQL查询语句,将结果作为DataFram ...

  7. SuperHyperMarket(优先队列+重载)

    SuperHyperMarket(优先队列+重载) 具体见代码注释 /* */ #include <iostream> #include <cstring> #include ...

  8. Promise链式调用 终止或取消

    Promise回调分两种方法,then成功,catch失败 let promise = new Promise(function(resolve, reject){ resolve('第一次成功') ...

  9. mysql 分组条件筛选

    mysql> select * from table1; +----------+------------+-----+---------------------+ | name_new | t ...

  10. 多线程 interrupt()方法

    java interrupt()方法只是设置线程的中断标记,当对处于阻塞状态的线程调用interrupt方法时(处于阻塞状态的线程是调用sleep, wait, join 的线程),会抛出Interr ...