一个程序中有多个线程在运行,我们需要监测各个线程的运行状态,看各个线程是否已经执行完成。
如:要统计系统的各个根目录下的文件数目,一个统计线程去统计一个根目录下的文件数目。但是我们想让程序在所有统计线程统计完毕后再统一输出统计结果,这就需要用到"监视线程"模型。
下面一种"轮询"监视模型,把每一个统计类线程添加到一个队列中,用一个监视线程循环地询问队列中的线程,如果某一个线程已经执行完毕,则将它从队列中移除。
下面是统计文件的主类
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);
}
}
}
}
分享到:
相关推荐
线程间通信: 详细讲解多线程之间如何进行通信,包括等待和通知机制、线程间的数据传递等。 死锁和解决: 介绍死锁的概念,解释死锁产生的原因和充要条件。 并发编程模型: 介绍不同的并发编程模型,如多生产者多...
Zulip是具有电子邮件线程模型的开源实时聊天应用程序。 该存储库中的代码将在Render上创建以下组件: Zulip Web /应用程序服务器,其中包含: NGINX:前端Web服务器,为Django和Tornado提供静态资产和代理Django:...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件...
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 学生提问:...
\ 第10章 多线程 李立夏介绍了Qt的多线程处理,包括两方面内容:传统的线程操作,以及与Qt事件机制相关的操作。这一章还涉及较多的基本概念,并逐一做了介绍。 261 \ 第11章 事件机制 李立夏介绍了Qt的事件处理模型...
\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 加快用户...
当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。 QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...
当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。 QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...
当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。 QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...
当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。 QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...
当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。 QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...
当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。 QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...
山寨QQ,Java聊天程序 Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构, 当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯...