多线程间通信---监视线程:
一、多线程间通信---监视线程:
用自己的话来说,就是线程间的通信,一个线程执行,同时用另一个线程来监视目标线程的运行状态.
二、以统计文件为例:
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
八、总结:
经过这个,了解到了线程通信之监视线程,又给自己补课了
相关推荐
多线程间通信,其实是多个线程操操作同一个资源,但是操作方式不同。典型实例有生产者和消费者,本文也通过实例来分析线程等待唤醒机制。 1、相关API介绍 public final void notify() 唤醒在此对象监视...
摘 要: 提出了一种在Windows NT下基于TCP/IP协议的多线程通信的设计与实现方法,在此基础上给出了多线程通信在蓄电池远程监控系统中的应用实例。 关键词: 多线程 实时性 TCP/IP协议 远程监控系统 传统的应用...
isDaemon 判断是否为守护线程。 run方法是不能用synchronized修饰,他是继承来的,不能改变其结构,而且,如果run方法加了synchronized,就变成单线程了,就没有并发了。 只要不是静态的同步方法,同步方法默认的...
学习多线程之一:线程通信--利用事件对象 在线程之间传送信号可以使用事件对象,用MFC的CEvent来表示。一个事件对象有两种状态:信号态与非信号态。线程能监视于信号态的事件,以便在适当的时间完成对事件的操作。
线程间通信: 详细讲解多线程之间如何进行通信,包括等待和通知机制、线程间的数据传递等。 死锁和解决: 介绍死锁的概念,解释死锁产生的原因和充要条件。 并发编程模型: 介绍不同的并发编程模型,如多生产者多...
文章目录神标题引入线程和进程多线程的优势线程创建方式继承Thread类来创建和启动实现Runnable接口重写run方法创建线程类使用 Callable 和 Future 创建线程三种创建线程方式做出对比线程生命周期线程控制join线程...
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中的 字符串类型...
1. 各种线程间通信 [跨平台]: 消息队列, 以及虚拟port; 2. 有限状态机 [跨平台]:适应中、大型状态机,并实现了状态机远程监视; 由于该有限状态机按照嵌入式规则实现,同样可以用于各种嵌入式环境。该状态机还...
特性(简化组件之间通信,支持事件监视器,支持动作执行器,支持自定义消息存储组件,支持自定义策略执行,支持单消费、多消费消息,支持消息幂等性处理,高内聚,低耦合,使代码更简单,非常快速,每秒可处理 ...
据的时候就要麻烦一点,在打开串口后首先主线程要设置要监视的串口通信事件,然后将监视线程打开,用 来监视主线程设置的这些串口通信事件是否已发生,当其中的某个事件发生后, 监视线程马上将该消息发送 给主线程...
实例45 监视多线程 实例46 防止多线程应用程序死锁 实例47 文件同步操作与应用 实例48 在COM程序设计中使用.NET组件 实例49 文件异步操作与多处理器系统 实例50 获取网络主机IP地址 实例51 C#对话信息框的应用...
3、监视线程的阻塞与死锁 4、监视GC的耗时。 监视本地JVM(Windows): 需要安装JProfiler windows版本 监视远程的JVM(Linux): 客户端需要安装JProfiler windows版本 服务需要安装JProfiler Linux版本 客户端与...
事件告诉线程何时去执行某一给定的任务,从而使多个线程流平滑。例如在某些网络应用程序中,一个线程(记为A)负责监听通信端口,另一个线程(记为B)负责更新用户数据。通过使用CEvent类,线程A可以通知线程B何时...
能实现客服端和服务器端的无序通信,加入多线程监视流状态,很好用!!
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
实例40 多线程同步运行 实例41 线程Thread Relative Static跟踪与实现 实例42 线程池(ThreadPool)的应用 实例43 多线程互斥运行 实例44 多线程时钟应用程序 实例45 监视多线程 ...
实例40 多线程同步运行 实例41 线程Thread Relative Static跟踪与实现 实例42 线程池(ThreadPool)的应用 实例43 多线程互斥运行 实例44 多线程时钟应用程序 实例45 监视多线程 ...
采用VS2010开发平台、C#高级程序设计语言,结合多线程技术,设计一套双机软件切换系统,按照MT/T 772—1998中8.13规定的主要性能测试方法进行严格测试,该双机软件切换系统具备软件自监视功能,并能够满足通用技术要求的...
任务队列是一种在线程或机器间分发任务的机制。 消息队列的输入是工作的一个单元,称为任务,独立的职程(Worker)进程持续监视队列中是否有需要处理的新任务。 Celery 用消息通信,通常使用中间人(Broker)在...
线程设计和实现多线程应用程序 设计和实现需要通过许多同步机制(如自旋锁、互斥锁、信号量和监视器)共享计算机资源的应用程序 使用标准 C 库实现 C 语言程序实现通过操作系统调用与计算机平台交互的应用程序 使用 ...