Java并发学习之十九——线程同步工具之Phaser
本文是学习网络上的文章时的总结。感谢大家无私的分享。
JDK 1.7 加入了一个新的工具Phaser。Phaser的在功能上与CountDownLatch有部分重合。
以下使用Phaser类来同步3个并发任务。
这3个任务会在3个不同的目录和它们的子目录中搜索扩展名是.log的文件。
这个任务被分成3个步骤:
1. 在指定的目录和子目录中获得文件扩展名为.log的文件列表。
2. 在操控台打印结果。
在步骤1和步骤2的结尾我们要检查列表是否为空。
假设为空。那么线程直接结束执行并从phaser类中淘汰。
package chapter3; import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.Phaser;
import java.util.concurrent.TimeUnit; 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 directoryProcess(File file){
File list[] = file.listFiles();
if(list != null){
for(int i = 0;i< list.length;i++){
if(list[i].isDirectory()
){
directoryProcess(list[i]);
}else{
fileProcess(list[i]);
}
}
}
}
private void fileProcess(File file){
if(file.getName().endsWith(end)){
results.add(file.getAbsolutePath());
}
} private void filterResults(){
List<String> newResults = new ArrayList<String>();
long actualDate = new Date().getTime();
for (int i = 0; i < results.size(); i++) {
File file = new File(results.get(i));
long fileDate = file.lastModified();
if(actualDate-fileDate<TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS)){
newResults.add(results.get(i));
}
}
results = newResults;
} private boolean checkResults(){
if(results.isEmpty()){
System.out.printf("%s: Phase %d: 0 results.\n", Thread
.currentThread().getName(), phaser.getPhase());
System.out.printf("%s: Phase %d: End.\n", Thread.currentThread()
.getName(), phaser.getPhase());
phaser.arriveAndDeregister();
return false; }else{
System.out.printf("%s: Phase %d: %d results.\n", Thread
.currentThread().getName(), phaser.getPhase(), results
.size());
phaser.arriveAndAwaitAdvance();
return true;
}
} private void showInfo(){
for (int i = 0; i < results.size(); i++) {
File file = new File(results.get(i));
System.out.printf("%s: %s\n", Thread.currentThread().getName(),
file.getAbsolutePath()); }
phaser.arriveAndAwaitAdvance();
} @Override
public void run() {
phaser.arriveAndAwaitAdvance();
System.out.printf("%s: Starting.\n", Thread.currentThread().getName()); File file = new File(initPath);
if(file.isDirectory()){
directoryProcess(file);
}
if(!checkResults()){
return ;
}
filterResults();
if(!checkResults()){
return;
}
showInfo();
phaser.arriveAndDeregister();
System.out.printf("%s: Work completed.\n", Thread.currentThread()
.getName()); } }
package chapter3; import java.util.concurrent.Phaser; public class Main5 { /**
* <p>
* </p>
* @author zhangjunshuai
* @date 2014-9-29 下午4:31:46
* @param args
*/
public static void main(String[] args) {
Phaser phaser = new Phaser(3); FileSearch system = new FileSearch("C:\\Windows","log",phaser);
FileSearch apps = new FileSearch("c:\\Program Files","log",phaser);
FileSearch documents = new FileSearch("c:\\Documents And Settings","log",phaser); Thread systemThread = new Thread(system,"System");
systemThread.start(); Thread appsThread = new Thread(apps,"apps");
appsThread.start(); Thread documentsThread = new Thread(documents,"documents");
documentsThread.start(); try {
systemThread.join();
appsThread.join();
documentsThread.join();
} catch (Exception e) {
e.printStackTrace();
} System.out.println("Terminated: " + phaser.isTerminated()); } }
执行结果
Java并发学习之十九——线程同步工具之Phaser的更多相关文章
- Java并发学习之中的一个——线程的创建
本文是学习网络上的文章时的总结,感谢大家无私的分享. 1.与每一个Java语言中的元素一样,线程是对象.在Java中,我们有两种方式创建线程: a.通过直接继承thread类,然后覆盖run方法. b ...
- java并发学习--第六章 线程之间的通信
一.等待通知机制wait()与notify() 在线程中除了线程同步机制外,还有一个最重要的机制就是线程之间的协调任务.比如说最常见的生产者与消费者模式,很明显如果要实现这个模式,我们需要创建两个线程 ...
- Java并发学习之十五——使用读写锁同步数据訪问
本文是学习网络上的文章时的总结.感谢大家无私的分享. 读写锁重要的是写锁的使用,仅仅用一个入口. 以下是读写锁使用的样例 package chapter2; import java.util.conc ...
- java并发编程(十九)----(JUC集合)总体框架介绍
本节我们将继续学习JUC包中的集合类,我们知道jdk中本身自带了一套非线程安全的集合类,我们先温习一下java集合包里面的集合类,然后系统的看一下JUC包里面的集合类到底有什么不同. java集合类 ...
- java web学习总结(十九) -------------------监听器简单使用场景
一.统计当前在线人数 在JavaWeb应用开发中,有时候我们需要统计当前在线的用户数,此时就可以使用监听器技术来实现这个功能了. 1 package me.gacl.web.listener; 2 3 ...
- java并发编程(十九)障碍器CyclicBarrier
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17512983 CyclicBarrier(又叫障碍器)同样是Java 5中加入的新特性,使 ...
- java并发编程(十四)同步问题的内存可见性
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17288243 加锁(synchronized同步)的功能不仅仅局限于互斥行为,同时还存在另 ...
- Java基础学习笔记十九 IO
File IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了.那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再 ...
- Java基础学习笔记十九 File
IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了.那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再把这些数据 ...
随机推荐
- 33条C#、.Net经典面试题目及答案
33条C#..Net经典面试题目及答案[zt] 本文集中了多条常见的C#..Net经典面试题目例如".NET中类和结构的区别"."ASP.NET页面之间传递值的几种方式? ...
- 【加解密】关于DES加密算法的JAVA加密代码及C#解密代码
JAVA加密: package webdomain; import java.security.Key; import java.security.spec.AlgorithmParameterSpe ...
- 封装cookie.js、EventUtil.js、
最近学习了javascript,封装好的东西看起来舒服,以备需要的时候拉出来,jquery对javascript做了很好的封装!以后会多用jquery多些 var CookieUtil = { get ...
- 流式计算之Storm简介
Storm是一个分布式的.容错的实时计算系统,遵循Eclipse Public License 1.0,Storm可以方便地在一个计算机集群中编写与扩展复杂的实时计算,Storm之于实时处理,就好比H ...
- Flex SDK包内文件夹内容说明
打开SDK目录,让我们看看SDK中都包含了哪些内容: ant包含Flex对Ant的支持库,JAR和Java源码都有,方便我们基于Ant完成对项目的构建 asdoc基于ASDOC我们可以很方便的生成代码 ...
- C++ __int64用法(转)
在做ACM题时,经常都会遇到一些比较大的整数.而常用的内置整数类型常常显得太小了:其中long 和 int 范围是[-2^31,2^31),即-2147483648~2147483647.而unsig ...
- 杭电ACM减花布条
这是原题的地址 http://acm.hdu.edu.cn/showproblem.php?pid=2087 Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条 ...
- Base64把图片、文件转码成字符串(互转)
文件Base64以后会翻倍的涨,例如一张52kb的图片 base64以后string文件大小为185kb,在通过string转回图片为135kb 图片转文字: UIImage *_originIm ...
- C#中的Collection 2
Core Generic interface IEnumerable<T>:you can interate my elemnts, no need to know the count, ...
- oracle:自定义多行合并聚合函数
原始表 COUNTRY CITY -------------------- -------------- 中国 台北 中国 香港 ...