phaser,开启三个线程分别搜索三个文件夹
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,开启三个线程分别搜索三个文件夹的更多相关文章
- 编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。如:ABCABCABC…… 依次递归
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.uti ...
- Lichee(三) Android4.0该产品的目标文件夹,Lichee链接---extract-bsp
由<Lichee() 在sun4i_crane平台下的编译>介绍了编译lichee的基本情况,我们终于得到了编译后的结果例如以下: out/ ├── android │ ├── bIm ...
- sublime 搜索时忽略文件夹
如上图:添加 "folder_exclude_patterns": ["要忽略的文件夹"]
- java实现基于关键字的文件夹(文件)的搜索、文件夹(文件)的复制、删除
最近在做一个项目,需要实现这几项功能,上网查了很多资料,自己研究了好几天终于实现了,现在与大家分享一下. 一.JAVA实现文件夹的搜索 在百度搜索N个技术文章,从哪些大牛们共享的资料中终于写出了我 ...
- Windbg 进程与线程 《第三篇》
Windbg既可以显示进程和线程列表,又可以显示指定进程或线程的详细信息.调试命令可以提供比taskmgr更详尽的进程资料,在调试过程中不可或缺. 一.进程命令 进程命令包括这些内容:显示进程列表.进 ...
- java中使用ReentrantLock锁中的Condition实现三个线程之间通信,交替输出信息
本文直接附上源代码,如下是自己写的一个例子 面试题需求: 使用Condition来实现 三个线程 线程1 线程2 线程3 三个交替输出 [按照 线程1(main)-->线程2-->线程3] ...
- java面试记录二:spring加载流程、springmvc请求流程、spring事务失效、synchronized和volatile、JMM和JVM模型、二分查找的实现、垃圾收集器、控制台顺序打印ABC的三种线程实现
注:部分答案引用网络文章 简答题 1.Spring项目启动后的加载流程 (1)使用spring框架的web项目,在tomcat下,是根据web.xml来启动的.web.xml中负责配置启动spring ...
- windows:shellcode 远程线程hook/注入(三)
今天介绍第三种远程执行shellcode的思路:函数回调: 1.所谓回调,简单理解: windows出厂时,内部有很多事务的处理无法固化(无法100%预料外部会遇到哪些情况),只能留下一堆的接口,让开 ...
- 使用Java 多线程编程 让三个线程轮流输出ABC,循环10次后结束
简要分析: 要求三个线程轮流输出,这里我们要使用一个对象锁,让关键部分的代码放入同步块当中.同时要有一个变量记录打印的次数到达10次循环后不再打印,另外一个就是要给每个线程一个标志号,我们根据标识号来 ...
随机推荐
- C++异常处理(二)----声明接口
接口声明的三种形式 抛出一切形式的异常 void freeobj(mycoach &t) { ) { cout <<"精神可嘉~但还是年龄太小" << ...
- 基金名称中的ABC是什么意思,我们该如何选择?
作者:牛大 | 公众号:定投五分钟 大家好,我是牛大.每天五分钟,投资你自己:坚持基金定投,终会财富自由! 大家经常会看到基金名称后面有字母ABC,这个表示什么意思呢,以及我们该如何选择呢?今天牛大给 ...
- ArrayList 集合 简单运用
集合 遍历 import java.util.ArrayList; class Demo02 { public static void main(String[] args) { // 创建Arra ...
- Processing设计Android APP(1) - 安装
1.安装环境: A. Android Studio B. Processing 3.4 (64bit) 首先,直接安装Android Studio,我这里版本是3.2.1. 然后,新建一个Sample ...
- Android入门教程(一)
Android是什么? Android是基于Linux开发性内核的操作系统,该平台由操作系统,中间件,用户界面和应用软件组成.Android的基本信息:软件类型,APK,发行商:Google,最早版本 ...
- Android Studio一直显示Building“project name”Gradle project info问题详解
关注我,每天都有优质技术文章推送,工作,学习累了的时候放松一下自己. 本篇文章同步微信公众号 欢迎大家关注我的微信公众号:「醉翁猫咪」 Android Studio一直显示 Building&quo ...
- Postgresql 数据库迁移步骤
1.操作位置:迁移数据库源(旧数据库主机) 找到PostgreSql 的data目录 关闭数据库进程 打包 tar -zcvf pgdatabak.tar.gz data/ ----------- ...
- GitHub 远程仓库 de 第一次配置
GitHub远程仓库, Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上.首先找一台电脑充当服务器的角色, 每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上 ...
- (13)Go接口
接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节. 接口 接口类型 在Go语言中接口(interface)是一种类型,一种抽象的类型. interfa ...
- ES6 数组方法 forEach map filter find every some reduce
1. forEach const colors = ['red', 'blue', 'green'] colors.forEach(function (params) { console.log(pa ...