`
Fhappy
  • 浏览: 69083 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

多线程通信:“监视线程”通讯模型

阅读更多

      一个程序中有多个线程在运行,我们需要监测各个线程的运行状态,看各个线程是否已经执行完成。
如:要统计系统的各个根目录下的文件数目,一个统计线程去统计一个根目录下的文件数目。但是我们想让程序在所有统计线程统计完毕后再统一输出统计结果,这就需要用到"监视线程"模型。
      下面一种"轮询"监视模型,把每一个统计类线程添加到一个队列中,用一个监视线程循环地询问队列中的线程,如果某一个线程已经执行完毕,则将它从队列中移除。

      下面是统计文件的主类

import java.io.File;
/**
 * 统计文件的主类
 * @author XMH
 *
 */
public class Manager {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		File[] roots = File.listRoots();//系统的根目录数组
		ThreadListener tl = new ThreadListener();//监听统计文件线程的监控线程
		for(int i=0;i<roots.length;i++){//根据根目录创建统计文件线程
			CountFile cf = new CountFile(roots[i]);
			tl.array.add(cf);
			cf.start();
		}
		tl.start();
	}
}

 统计文件的线程类 

/**
 * 统计文件的线程类
 */
import java.io.File;

public class CountFile extends Thread {
	// 根目录名
	private File root;
	// 标志线程是否执行完毕的属性
	private boolean finished;
	//要输出的信息
	String info;

	// 构造器,传入一个根目录名
	public CountFile(File root) {
		this.root = root;
	}

	// 查看线程是否已经执行完毕
	public boolean isFinished() {
		return finished;
	}

	// 通过线程进行文件统计
	public void run() {
		System.out.println(root+"盘文件统计开始");
		int count = countProcess(root);
		info = root.getAbsolutePath()+"盘统计文件数为"+count+"\n";
		finished = true;
		System.out.println(root+"盘文件统计完毕");
	}

	private int countProcess(File dir) {
		int count = 0;
		if (!dir.exists()) {// 如果该文件指向的地址不存在
			return count;
		}
		// 将文件中的子文件保存在文件数组中
		File[] files = dir.listFiles();
		if (files == null) {// 如果文件数组为空,则返回0
			return count;
		}
		for (int i = 0; i < files.length; i++) {
			if (files[i].isDirectory()) {// 如果是文件夹
				count += countProcess(files[i]);
			} else if (files[i].isFile()) {// 如果是标准文件
				count++;
			}
		}
		return count;
	}
}

      监视统计线程的线程类 

 

 

/**
 * 监视统计线程的线程类
 */
import java.util.ArrayList;

public class ThreadListener extends Thread{

	ArrayList<CountFile> array = new ArrayList<CountFile>();
	String result="";
	
	public void run(){
		boolean flag=false;
		while(!flag){
			for(int i=0;i<array.size();i++){
				if(array.get(i).isFinished()){//判断统计文件的线程是否已经完成
					result+=array.get(i).info;
					array.remove(i);//将已经完成的线程对象从队列中移除
				}
			}
			try {//每隔一定时间监听一次各个文件统计线程
				Thread.sleep(50);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			if(array.size()==0){//如果统计线程都已经完成
				flag=true;
				System.out.println(result);
			}
		}
	}
}

 

 

 
0
4
分享到:
评论

相关推荐

    java并发编程理论基础精讲

    线程间通信: 详细讲解多线程之间如何进行通信,包括等待和通知机制、线程间的数据传递等。 死锁和解决: 介绍死锁的概念,解释死锁产生的原因和充要条件。 并发编程模型: 介绍不同的并发编程模型,如多生产者多...

    zulip:在渲染上部署Zulip

    Zulip是具有电子邮件线程模型的开源实时聊天应用程序。 该存储库中的代码将在Render上创建以下组件: Zulip Web /应用程序服务器,其中包含: NGINX:前端Web服务器,为Django和Tornado提供静态资产和代理Django:...

    vc++ 开发实例源码包

    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...

    vc++ 应用源码包_1

    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...

    vc++ 应用源码包_2

    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...

    vc++ 应用源码包_6

    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...

    vc++ 应用源码包_5

    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...

    vc++ 应用源码包_3

    实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...

    疯狂JAVA讲义

    11.5.1 Java事件模型的流程 403 11.5.2 事件和事件监听器 405 11.5.3 事件适配器 409 11.5.4 事件监听器的实现形式 411 11.6 AWT的菜单 413 11.6.1 菜单条、菜单和菜单项 414 11.6.2 右键菜单 416 学生提问:...

    精通qt4编程(源代码)

    \ 第10章 多线程 李立夏介绍了Qt的多线程处理,包括两方面内容:传统的线程操作,以及与Qt事件机制相关的操作。这一章还涉及较多的基本概念,并逐一做了介绍。 261 \ 第11章 事件机制 李立夏介绍了Qt的事件处理模型...

    精通Qt4编程(第二版)源代码

    \10.4.4 多线程网络示例 279 \10.5 小结 282 \第11章 事件处理 283 \11.1 事件机制 283 \11.1.1 事件来源与类型 283 \11.1.2 事件处理方法 284 \11.2 事件处理器 285 \11.3 事件过滤器 290 \11.4 加快用户...

    JAVA上百实例源码以及开源项目源代码

     当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。  QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...

    JAVA上百实例源码以及开源项目

     当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。  QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...

    java源码包2

     当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。  QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...

    java源码包---java 源码 大量 实例

     当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。  QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...

    java源码包3

     当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。  QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...

    java源码包4

     当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。  QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    山寨QQ,Java聊天程序 Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构, 当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯...

Global site tag (gtag.js) - Google Analytics