`
Cb123456
  • 浏览: 63770 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

多线程间通信---监视线程

    博客分类:
  • java
阅读更多

多线程间通信---监视线程:

 一、多线程间通信---监视线程:

 用自己的话来说,就是线程间的通信,一个线程执行,同时用另一个线程来监视目标线程的运行状态.

 

 二、以统计文件为例:

  1.统计文件的线程类:

package 监控线程;

import java.io.File;

/**
 * 统计某一个磁盘的相关文件数据
 * @author Administrator
 *
 */
public class CountFile extends Thread {

	private String rootDirName;//操作的根目录的名称
	private int dirCount=0;//目录数量
	private int realFileCount=0;//文件数量
	private int lengthCount=0;//文件长度
	private boolean finished =false;//是否运行结束
	
	//传入根目录
	public CountFile(String root){
		this.rootDirName = root;	
	}
	
	//线程进行计算:
	@Override
	public void run() {
		// TODO Auto-generated method stub
		//super.run();
		long start=System.currentTimeMillis();
		//System.out.println(start);
		lengthCount=countProcess(this.rootDirName);
		long timeCost=System.currentTimeMillis()-start;
		//System.out.println(timeCost);
		finished =true;	
	
	}
	
	//统计文件长度,数量,文件夹个数
	private int countProcess(String dir){
		int count=0;
		File dirFile = new File(dir);
		
		if(!dirFile.exists()){//如果用户输入的目录不存在
			
			return count;
		}
		
		File[] subFile=dirFile.listFiles();
		
		if(subFile==null){
			
			return count;
		}
		
		for(int i=0;i<subFile.length;i++){
			
			if(subFile[i].isDirectory()){
				dirCount++;
				count+=countProcess(subFile[i].getAbsolutePath());
			}
			if(subFile[i].isFile()){
				realFileCount++;
				count+=subFile[i].length();
				
			}			
		}
		
		//System.out.println("count数量:"+count);
		return count;
	}
	
	//线程是否结束
	public boolean isFinished(){
		return finished;
	}
	
	//打印结果
	public String getResult(){		
	 StringBuffer stb = new StringBuffer();
	 stb.append(rootDirName+"盘统计结果如下:\r\n");
	 stb.append("文件数量:"+realFileCount);
	 stb.append("目录数量:"+dirCount);
	 stb.append("文件总长度(单位:字节):"+lengthCount);
	 
	 return stb.toString();
		
	}
	
}

 

 2.监视线程类:

package 监控线程;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 监控线程通讯模型:
 * 1.启动任务线程
 * 2.对任务线程进行监视
 * @author Administrator
 *
 */
public class MainCount implements Runnable {

	//保存统计线程对象的队列
	private static List<CountFile> countList = new ArrayList();
	
	
	public static void main(String[] args) {
		File[] rootFiles=File.listRoots();
		
		for (int i = 0; i < rootFiles.length; i++) {
			CountFile cb = new CountFile(rootFiles[i].getAbsolutePath());
			cb.start();
			countList.add(cb);//将每个统计线程对象放入要监控的集合中
		}
		
		System.out.println(rootFiles.length+"个统计线程已经启动");
		
		
		//启动监视线程
		new Thread(new MainCount()).start();
		System.out.println("监视线程已经启动");
	}
	
	
	//监控线程每隔3秒钟检测统计线程集合,看是否有
	//完成统计的,如有完成,将其从集合中移除
	@Override
	public void run() {
		// TODO Auto-generated method stub
		boolean flag =true;
		String result="";
		while(flag){
	//每隔一秒钟,检查一下队列中的线程对象的状态	
	Iterator<CountFile>  it=countList.iterator();
	while(it.hasNext()){
		CountFile cf=it.next();
		if (cf.isFinished()) {//如果这个线程已经统计完成
			result+=cf.getResult()+"\r\n";//取得统计结果;
			//countList.remove(cf);//移除已经运行完毕的线程
			it.remove();
		}
		
	}
	
	//当统计线程队列为空时,说明所有的任务已执行完毕,本监视线程也要退出
	if(countList.isEmpty()){
		
		flag=false;//让统计线程结束
		
	}
	
	try{
		Thread.sleep(1000);
	}catch(Exception e){
		
	}
		
	}
	System.out.println("并行统计结果如下:");
	System.out.println(result);
	}
}

 

 三、运行结果:

 

1.第1次运行结果:

 


 

2.第2次运行结果:



 

 四、我的盘:


 

 五、运行结果分析:

 通过我的盘,和两次的运行结果综合对比,发现两次的运行结果不一样的

,而且还出现负值

 

 六、查看资料:

File类的length方法.


 
 

通过看API发现:

    1.文件夹也是有长度的

    2.当文件是文件夹时,返回值是随机的,这个也就是可以解释为什么是负值的,和长度大小不一样的

 

 

七、补充:

   在移除已经运行完毕的线程时,使用List.remove(i)的方法会出现:ConcurrentModificationException异常

ConcurrentModificationException异常:



 

 原因是List里面的线程也在修改Collection.具体参见:

   http://www.2cto.com/kf/201403/286536.html

 

八、总结:

 经过这个,了解到了线程通信之监视线程,又给自己补课了

 

  • 大小: 23.5 KB
  • 大小: 23.1 KB
  • 大小: 47.4 KB
  • 大小: 15.5 KB
  • 大小: 31.5 KB
1
0
分享到:
评论

相关推荐

    java多线程通信之等待唤醒机制

     多线程间通信,其实是多个线程操操作同一个资源,但是操作方式不同。典型实例有生产者和消费者,本文也通过实例来分析线程等待唤醒机制。  1、相关API介绍  public final void notify()  唤醒在此对象监视...

    通信与网络中的基于TCP/IP的多线程通信及其在远程监控系统中的应用

    摘 要: 提出了一种在Windows NT下基于TCP/IP协议的多线程通信的设计与实现方法,在此基础上给出了多线程通信在蓄电池远程监控系统中的应用实例。 关键词: 多线程 实时性 TCP/IP协议 远程监控系统  传统的应用...

    java—多线程的通信、生产者与消费者模式

    isDaemon 判断是否为守护线程。 run方法是不能用synchronized修饰,他是继承来的,不能改变其结构,而且,如果run方法加了synchronized,就变成单线程了,就没有并发了。 只要不是静态的同步方法,同步方法默认的...

    REGSTAR_src.zip

    学习多线程之一:线程通信--利用事件对象 在线程之间传送信号可以使用事件对象,用MFC的CEvent来表示。一个事件对象有两种状态:信号态与非信号态。线程能监视于信号态的事件,以便在适当的时间完成对事件的操作。

    java并发编程理论基础精讲

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

    BAT面试官有点懵系列,Java多线程你真的理解透彻了吗?带你玩转一次多线程!Let’s go!别再out了!

    文章目录神标题引入线程和进程多线程的优势线程创建方式继承Thread类来创建和启动实现Runnable接口重写run方法创建线程类使用 Callable 和 Future 创建线程三种创建线程方式做出对比线程生命周期线程控制join线程...

    Visual Basic.NET自动化系统监控--RS-232串行通信.(清华出版.范逸之.廖锦棋)

    3.4.3 创建多线程 140 3.4.4 定时器与DoEvents() 151 常识问答 154 本章习题 154 第4章 串行通信中的字符与字节 155 4.1 字符与字节 155 4.1.1 字符和字节的差别 155 4.1.2 Visual Basic .NET中的 字符串类型...

    my lib [各种用途的C语言库]

    1. 各种线程间通信 [跨平台]: 消息队列, 以及虚拟port; 2. 有限状态机 [跨平台]:适应中、大型状态机,并实现了状态机远程监视; 由于该有限状态机按照嵌入式规则实现,同样可以用于各种嵌入式环境。该状态机还...

    .NET 事件总线,简化项目、类库、线程、服务等之间的通信,代码更少,质量更好 ‎

    ‎特性(简化组件之间通信,支持事件监视器,支持动作执行器,支持自定义消息存储组件,支持自定义策略执行,支持单消费、多消费消息,支持消息幂等性处理,高内聚,低耦合,使代码更简单,非常快速,每秒可处理 ...

    VC读取串口数据,操作数据 串口操作API

    据的时候就要麻烦一点,在打开串口后首先主线程要设置要监视的串口通信事件,然后将监视线程打开,用 来监视主线程设置的这些串口通信事件是否已发生,当其中的某个事件发生后, 监视线程马上将该消息发送 给主线程...

    Visual.C#.编程精彩百例

    实例45 监视多线程 实例46 防止多线程应用程序死锁 实例47 文件同步操作与应用 实例48 在COM程序设计中使用.NET组件 实例49 文件异步操作与多处理器系统 实例50 获取网络主机IP地址 实例51 C#对话信息框的应用...

    JProfiler入门教程

    3、监视线程的阻塞与死锁 4、监视GC的耗时。 监视本地JVM(Windows): 需要安装JProfiler windows版本 监视远程的JVM(Linux): 客户端需要安装JProfiler windows版本 服务需要安装JProfiler Linux版本 客户端与...

    Cevent类详解及使用技巧

    事件告诉线程何时去执行某一给定的任务,从而使多个线程流平滑。例如在某些网络应用程序中,一个线程(记为A)负责监听通信端口,另一个线程(记为B)负责更新用户数据。通过使用CEvent类,线程A可以通知线程B何时...

    聊天程序Java源码

    能实现客服端和服务器端的无序通信,加入多线程监视流状态,很好用!!

    vc++ 开发实例源码包

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

    《Visual.C#.编程精彩百例》配套光盘.part2

    实例40 多线程同步运行 实例41 线程Thread Relative Static跟踪与实现 实例42 线程池(ThreadPool)的应用 实例43 多线程互斥运行 实例44 多线程时钟应用程序 实例45 监视多线程 ...

    《Visual.C#.编程精彩百例》配套光盘part1

    实例40 多线程同步运行 实例41 线程Thread Relative Static跟踪与实现 实例42 线程池(ThreadPool)的应用 实例43 多线程互斥运行 实例44 多线程时钟应用程序 实例45 监视多线程 ...

    煤矿安全监控系统双机软件切换功能实现

    采用VS2010开发平台、C#高级程序设计语言,结合多线程技术,设计一套双机软件切换系统,按照MT/T 772—1998中8.13规定的主要性能测试方法进行严格测试,该双机软件切换系统具备软件自监视功能,并能够满足通用技术要求的...

    celery.pdf

    任务队列是一种在线程或机器间分发任务的机制。 消息队列的输入是工作的一个单元,称为任务,独立的职程(Worker)进程持续监视队列中是否有需要处理的新任务。 Celery 用消息通信,通常使用中间人(Broker)在...

    程序员考试刷题-COMP362---Operating-Systems:CSUCI2020秋季

    线程设计和实现多线程应用程序 设计和实现需要通过许多同步机制(如自旋锁、互斥锁、信号量和监视器)共享计算机资源的应用程序 使用标准 C 库实现 C 语言程序实现通过操作系统调用与计算机平台交互的应用程序 使用 ...

Global site tag (gtag.js) - Google Analytics