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)
上一篇 2022年2月5日 上午7:00
下一篇 2022年2月5日 上午8:00


相关推荐

  • Pycharm远程连接服务器(windows下远程修改服务器代码)[通俗易懂]

    Pycharm远程连接服务器(windows下远程修改服务器代码)[通俗易懂]http://blog.csdn.net/duankaifei/article/details/418986411、写在前面  之前一致用putty,ssh,修改代码,或者本地修改,上传到服务器,各种不爽,现在改用xshell,但是有时候还是不方便感觉,于是自己配置了远程连接pycharm,这样不用总是到代码里修改,直接在windows下pycharm里修改再保存就可以实现同步更新

    2022年8月29日
    5
  • Java 上传文件到ftp服务器「建议收藏」

    Java 上传文件到ftp服务器「建议收藏」前两篇文章我们搭建了一个ftp服务器,并对服务器进行了相应的配置,这篇文章我们来说一下我们如何上传文件。        先介绍一下项目,本项目采用的是springmvc+spring+mybatis,用maven进行项目管理。看一下项目结构。         如果单独做测试的话不用这么费劲,写一个简单的测试类就ok了!而在这个项目中,parent是所有项

    2025年9月12日
    7
  • 小区口的凉皮大叔,实力演绎如何低调地月入30000

    小区口的凉皮大叔,实力演绎如何低调地月入30000

    2022年3月12日
    70
  • 牛屎芯片 | 硬件之家「建议收藏」

    牛屎芯片 | 硬件之家「建议收藏」前言:牛屎芯片又叫邦定芯片或软封装芯片,一般应用于价格较为低廉的电子设备中。原文链接:http://www.allchiphome.com/post/cow-shit_chip一、牛屎芯片牛屎芯

    2022年8月2日
    7
  • 详谈利用系统漏洞及mysql提权

    详谈利用系统漏洞及mysql提权提权,顾名思义就是提升权限,当我们getshell⼀个⽹站之后,⼤部分情况下我们的权限是⾮常低的,这时就需要利⽤提权,让原本的低权限(如只允许列⽬录)→⾼权限(拥有修改⽂件的能⼒),权限提升后,对接下来的渗透有很⼤帮助

    2022年7月27日
    9
  • android之R cannot be resolved to a variable

    刚才又遇到了R cannot be resolved to a variable的问题,就翻了翻网上的资料,调理的整理了一下1. 检查Android 的SDK是否丢失需要重新下载,检查build path,把需要导入的JAR包确认都导入成功2. 确保class没有import Android.R,注意是不能有Android.R,可以有其他R文件,比如你自己的包;3. 错误cla

    2022年3月9日
    64

发表回复

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

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