多线程间通信---监视线程:
一、多线程间通信---监视线程:
用自己的话来说,就是线程间的通信,一个线程执行,同时用另一个线程来监视目标线程的运行状态.
二、以统计文件为例:
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
八、总结:
经过这个,了解到了线程通信之监视线程,又给自己补课了
相关推荐
### Java多线程—线程间的通信 #### 一、线程间的通信 ##### (1)为什么要处理线程间的通信? 在多线程环境中,不同的线程可能需要协同工作来完成一项任务。例如,一个线程负责生产数据,另一个线程负责消费这些...
线程间通信和同步是多线程编程中的关键问题,Java提供了`synchronized`关键字、`wait()`, `notify()` 和 `notifyAll()` 方法,以及`java.util.concurrent`包下的高级工具如`Semaphore`, `CyclicBarrier`, `...
"10.3_C#多线程监视器程序"可能是一个示例项目,旨在教授如何在C#环境中管理和监控多个并发线程。让我们深入探讨一下这个主题,了解多线程的核心概念以及在C#中如何使用它们。 首先,多线程允许一个应用程序同时...
在Java编程中,多线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而提高了系统的效率和响应性。然而,在某些场景下,我们可能需要控制线程的执行顺序,确保它们按照特定的顺序交替运行,这在并发编程...
本文将深入探讨Java多线程中的关键知识点,包括创建线程、主线程、线程优先级、线程组、线程同步以及线程间的通信。 1. **创建线程** 在Java中,可以通过两种方式创建线程:继承`Thread`类或实现`Runnable`接口。...
多线程技术在数据通信中的应用 多线程技术在数据通信中的应用是指在数据通信系统中使用多线程技术来提高系统的安全性和数据的可靠性。多线程技术的应用可以使系统的循环在使用中对整个系统的情况进行合理全面的调度...
Java多线程编程中的线程间通信是解决并发问题的关键技术之一。在多线程环境中,线程间的协作和同步往往需要依赖于等待与通知机制,以确保在正确的时间执行正确的操作,避免资源的竞争和死锁。等待与通知是Java中实现...
在编程领域,多线程通信是提升程序效率和并发能力的重要技术。特别是在处理大量数据时,如读写文件,多线程可以同时执行不同的任务,从而显著提高整体性能。本项目着重探讨如何在多线程环境中实现安全有效的文件读写...
在实时数据处理系统中,多线程技术的使用是不可或缺的,而线程间通信是实现多线程协作工作的基础。本文将详细探讨线程间通信的几种常见方法,并以GPS实时数据处理系统为应用背景,分析这些方法的实际运用。 首先,...
### Java多线程知识点总结及企业真题解析 #### 一、知识点总结 ##### (1)多线程相关概念 1. **程序、进程和线程的区分**: - **程序**:为了完成特定的任务而编写的指令集合。它是静态的概念。 - **进程**:...
线程的状态管理是多线程编程中非常重要的部分。Java线程有六种状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED。NEW表示线程刚创建还未启动,RUNNABLE表示线程在执行或等待CPU资源,BLOCKED表示...
通过学习以上知识点,并结合压缩包中的实例代码(尽管未给出具体代码,但通常会包含创建、启动线程,以及线程间通信的示例),你可以深入理解VB中的多线程编程。实践这些概念,对于编写高效、响应迅速的应用程序至关...
Java多线程是Java编程中的一个关键领域,尤其在面试中常常被重点考察。这份"【面试资料】-(机构内训资料)Java多线程面试59题(含答案)_"的压缩文件包含了59个关于Java多线程的面试问题及解答,可以帮助我们深入...
在编程领域,线程间通信(Inter-Thread Communication, 简称ITC)是多线程编程中的重要概念,特别是在并发环境下确保数据同步和程序正确性时必不可少。线程间通信主要解决的问题是,当两个或多个线程需要协作完成一...
- 同步I/O操作:多线程可以使低速输入/输出操作如串口通信和仪器初始化并行进行,减少等待时间。 - 利用多处理器:在多核CPU环境下,每个处理器可以执行一个线程,真正实现并发执行,提高程序性能。 - 环境隔离:...
在C#.NET编程环境中,多线程是一种强大的技术,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应性。以下将详细讲解C#.NET中的多线程及其相关实例,包括基本使用、线程互斥等核心概念。 1. **多线程...
- **WaitHandle**:`Mutex`, `Event`等是等待句柄,用于线程间的通信和同步。 - **双重检查锁定Singleton**:确保单例模式的安全初始化,但某些情况下可能存在线程竞争的问题。 - **比较锁语句**:`lock`、`Mutex...
在VB(Visual Basic)编程环境中,多线程是一种高级编程技术,它允许应用程序同时执行多个独立的任务,从而提高程序的效率和响应性。在VB中实现多线程,主要是通过`Thread`对象或者.NET Framework提供的`System....
- `Mutex`:用于多线程间的互斥访问,确保同一时间只有一个线程访问特定资源。 - `Semaphore`:控制同时访问特定资源的线程数量。 - `Monitor`:基于监视器的概念,用于保护共享资源,使用`Enter()`和`Exit()`...