Java并发学习之十九——线程同步工具之Phaser「建议收藏」

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「建议收藏」

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115394.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • USB转232和485的区别

    1串口串口,即串行通信接口,与之相对应的另一种接口叫并口,并行接口。两者的区别是,传输一个字节(8个位)的数据时,串口是将8个位排好队,逐个地在1条连接线上传输,而并口则将8个位一字排开,分别在8条连接线上同时传输,也就是进行数据传输的接口串口是一种物理接口形式,(硬件)通常指COM接口,当然这些接口有着很多标准接口标准:串口通信的接口标准有很多,而我们所了解的RS-23…

    2022年4月7日
    78
  • Asp.Net MVC模型验证正则表达式[通俗易懂]

    Asp.Net MVC模型验证正则表达式[通俗易懂][RegularExpression(@”^\+?[1-9][0-9]*$”,ErrorMessage=”排序内容必须为不小于1的正整数”)][Display(Name=”排序”)]publicoverrideNullable<int>OrderNum{get;set;}参考地址mvc模型验证及正则表达式如何在MVC3正则表达式中为NOTNULL或ZERO提供数据注释验证模型验证表达式可叠加[NotNullExpression]//非空[Regula

    2022年7月22日
    7
  • py2exe打包多个py文件_Python导入包

    py2exe打包多个py文件_Python导入包上回在《使用PyInstaller打包Python程序》中,我们介绍了使用PyInstaller对Python程序进行打包,今天带大家认识一个新的工具:py2exe。接下来将从这几个方面进行介绍:基本使用方法、高级参数、注意点等。简介&amp;安装py2exe是一个将python脚本转换成Windows上的可独立执行的可执行程序(*.exe)的工具,这样,你就可…

    2022年9月11日
    0
  • 数据时代大数据管理,主要有哪些策略?「建议收藏」

    数据时代大数据管理,主要有哪些策略?「建议收藏」1.对大数据时代的大数据管理框架进行创新在大数据时代的大数据管理形式不断发展过程中,给企业发展带来冲击非常巨大。因此,企业要根据我国信息技术不断发展的形式,对大数据管理框架进行全面的设计和创新,如图1所示。在大数据的处理的过程中,主要是围绕着数据资产进行管理的,同时对大数据时代的大数据管理制度,进行全面的规划行、设计、创新,这样对其它信息技术管理领域,提供了便利的条件。其实,大数据时代的大数据管…

    2022年6月10日
    24
  • win7下虚拟显示器完成记(virtual monitor)——VDI显卡透传场景「建议收藏」

    win7下虚拟显示器完成记(virtual monitor)——VDI显卡透传场景「建议收藏」背景本次使用wddm过滤驱动的应用场景是VDIGPU透传场景,我这边运用WDDM过滤驱动,也有人叫wddmhook,主要有如下功能:(1)给透传显卡虚拟出一个显示器,因为透传显卡都是插在服务器上,一台服务器需要插十几张显卡(消费级显卡),不可能给每个显卡插一个显示器,不插显示器又会存在分辨率无法设置,分辨率过低的问题,为此需要自己虚拟一个显示器“插”在透传显卡上。(2)我们VDI使…

    2022年8月21日
    8
  • [数据库] 第一范式、第二范式、第三范式、BC范式

    [数据库] 第一范式、第二范式、第三范式、BC范式数据描述术语对应表关键码完全依赖、部分依赖、传递依赖第一范式、第二范式、第三范式

    2022年5月24日
    32

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号