大家好,又见面了,我是全栈君。
本文是学习网络上的文章时的总结。感谢大家无私的分享。
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());
}
}
执行结果
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/115394.html原文链接:https://javaforall.cn