`
Fhappy
  • 浏览: 70212 次
  • 性别: 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
分享到:
评论

相关推荐

    select_client.rar_Socket多线程通信_socket select_socket 多线程

    Socket多线程通信是网络编程中的重要概念,特别是在构建高性能、高并发的服务器时不可或缺。在标题"select_client.rar_Socket多线程通信_socket select_socket 多线程"中,我们可以推断这是一个关于如何利用Socket...

    JAVA多线程模型详解

    在多线程编程领域,Java作为一门广泛使用的编程语言,其内置的多线程模型一直是学习和应用的重点。本文将深入探讨Java多线程模型的相关知识点,包括线程与进程的区别、线程的实现原理、线程的创建方法以及线程的阻塞...

    线程通信安全问题

    在Java编程中,多线程通信是一个至关重要的概念,特别是在并发编程中,它涉及到线程间的协作和数据共享。线程通信安全问题是指在多线程环境下,如何保证多个线程对共享资源进行访问时的正确性和一致性。在这个场景下...

    C#多线程多任务管理模型.zip

    本压缩包文件"**C#多线程多任务管理模型**"提供了相关的代码示例和项目资源,帮助开发者深入理解和应用这一技术。 1. **线程基础**: - **线程定义**:线程是操作系统分配CPU时间的基本单元,一个进程可以有多个...

    普通的SOCKET多线程阻塞模型

    "普通的SOCKET多线程阻塞模型"是指使用标准的Socket接口,结合多线程技术实现的一种通信模型,它广泛应用于VC(Visual C++)开发环境中。在这一模型中,每个线程负责处理一个连接,当线程在进行读写操作时,如果数据...

    JAVA单线程多线程

    单线程模型简化了程序设计,降低了程序复杂度,使得开发者可以更专注于业务逻辑的实现,而无需过多考虑多线程间的同步问题。 单线程的优势主要体现在以下几个方面: 1. **简化程序设计**:由于无需处理多线程间的...

    java多线程代码案例(创建线程,主线程,线程优先级,线程组,线程同步,线程间的通信)

    本文将深入探讨Java多线程中的关键知识点,包括创建线程、主线程、线程优先级、线程组、线程同步以及线程间的通信。 1. **创建线程** 在Java中,可以通过两种方式创建线程:继承`Thread`类或实现`Runnable`接口。...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例)

    自.NET 4.0引入`Task`类后,推荐使用异步编程模型(如`async/await`关键字)来替代多线程,因为它可以更好地管理CPU和I/O操作,提供更好的用户体验。 7. **线程通信** `WaitHandle`类(如`AutoResetEvent`, `...

    JAVA多线程模式高清版+DEMO

    在"Java多线程设计模式_清晰完整PDF版"文档中,你可能还会学习到如何结合实际场景选择合适的线程模型,如何优化多线程程序,以及如何调试和处理线程安全问题。这些内容对于提升Java并发编程能力非常有帮助,对于开发...

    多线程面试59题(含答案).pdf

    多线程可以让多段逻辑同时工作,充分利用 CPU 的资源,防止阻塞可以防止程序的停止运行,多线程还可以便于建模,分解大任务为小任务,分别建立程序模型。 线程和进程的主要区别在于它们是不同的操作系统资源管理...

    实现多线程之间通讯第二节

    在多线程环境下,线程间的通信至关重要,以确保数据的一致性和程序的正确性。本节主要讲解如何使用`wait()`和`notify()`方法来实现Java中的线程间通信。 首先,我们要明白`wait()`, `notify()`, 和 `notifyAll()`都...

    vb多线程演示代码

    在VB(Visual Basic)编程环境中,多线程技术是一种关键的高级特性,它允许程序同时执行多个任务,提高应用程序的响应速度和效率。本压缩包包含的“vb多线程演示代码”提供了一系列示例,旨在帮助开发者理解和应用VB...

    CnComm 多线程串口通讯库

    1. **多线程通信**:CnComm的核心特性是支持多线程操作,这意味着它可以同时处理多个串口连接,或者在一个连接上进行并发读写。这极大地提高了串口通信的效率,特别是在需要处理大量并发请求或实时性要求高的应用...

    Java多线程-线程间的通信

    ### Java多线程—线程间的通信 #### 一、线程间的通信 ##### (1)为什么要处理线程间的通信? 在多线程环境中,不同的线程可能需要协同工作来完成一项任务。例如,一个线程负责生产数据,另一个线程负责消费这些...

    C#多线程编程.Net Winform

    1. 调试多线程应用:Visual Studio提供了强大的调试工具,如线程窗口、同步监视等。 2. 性能优化:合理分配任务,避免过度创建线程,使用异步编程减少阻塞。 通过深入理解和实践以上知识点,你将能够熟练掌握C#中的...

    2017年计算机二级考试java章节辅导:多线程之间的通讯 .docx

    2017年计算机二级考试的Java章节辅导中,重点介绍了生产者和消费者模型,这是一种典型的多线程通信方式,通过共享数据结构实现线程间的交互。 1. **生产者与消费者模型** 生产者和消费者模型是一种设计模式,它...

    VB实例:监视网络连接并清除历史记录.rar

    - **多线程处理**:对于可能耗时的操作(如清理历史记录),可以考虑使用多线程,以避免阻塞用户界面。 综上所述,"VB实例:监视网络连接并清除历史记录"是一个初级的VB网络应用示例,涵盖了网络连接检测、窗体...

    马士兵多线程训练营笔记

    5. **线程通信**:wait()、notify()、notifyAll()方法的使用,以及在生产者消费者模型、哲学家就餐问题等经典示例中的应用。 6. **线程池**:ExecutorService、ThreadPoolExecutor和Future接口的理解,线程池的配置...

    C#开发之多线程授课实例代码

    在C#编程中,多线程是一项至关重要的技术,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应性。本教学实例聚焦于如何在C#中使用多线程,通过具体的代码示例帮助开发者深入理解这一概念。 首先,我们要...

Global site tag (gtag.js) - Google Analytics