`
yxsylyh
  • 浏览: 35070 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

多线程编程的一个例子

    博客分类:
  • JAVA
阅读更多

关于多线程,理解上不难,做出来真不容易。

 

作业题是这样的:做三个线程(A、B、C),启动后输出启动信息,然后A、B调用wait等待;线程C调用sleep休眠一段时间,然后调用notifyAll,使线程A和线程B继续运行。线程A和线程B恢复运行后输出结束信息后结束,线程C判断线程A和B结束后,C自己也结束。

 

最初做的时候,抛出异常,网上查找,才知道多线程的代码要放到synchronized块里面。OK!照做,可还是出错,没有被唤醒。仔细看多线程说明,是需要一个共同的数据作为等待和唤醒的共享资源。费劲周折,使用Boolean值吧,可还是不唤醒,即使加了static也不行。

 

最后在一篇博文里看到只用布尔值还不行,得用数组,于是把布尔值改为布尔数组,问题最终得到解决。

 

最终代码是这样:

package thread;

/**
 * 
 * 线程类
 * 
 * 功能: 如果标志 isManager 是 False,则该线程是普通线程(A和B线程),线程开始并输出信息后进入等待状态;<br>
 * 如果标志 isManager 是 True,则该线程是管理线程(C线程),线程开始、输出信息并休眠一段时间(1秒)后唤醒其它线程。<br>
 * 
 * status 是线程唤醒条件,为 false 的话,则普通线程要一直等待下去;<br>
 * 管理线程设置其值为 true ,并唤醒其它线程。
 * 
 */
public class ThreadABC extends Thread {

	String threadName = "";
	Boolean isManager = Boolean.FALSE;
	static Boolean[] status = { false };
	int time = 1000; // 休眠时长

	/**
	 * 构造函数
	 */
	public ThreadABC() {
	}

	/**
	 * 构造函数
	 * 
	 * @param threadName
	 *            线程名称
	 * @param isManager
	 *            线程标志(false 为普通线程,true 为管理线程)
	 * @param status
	 *            线程唤醒条件(也许不需要从外部赋值?)
	 */
	public ThreadABC(String threadName, Boolean isManager, Boolean[] status) {
		this.threadName = threadName;
		this.isManager = isManager;
		this.status = status;
	}

	public Boolean[] getStatus() {
		return status;
	}

	public void setStatus(Boolean[] status) {
		this.status = status;
	}

	public void run() {
		System.out.println(threadName + " 线程已经启动!");
		// 如果不是管理线程,则进入等待状态
		if (!isManager) {
			// 如果满足等待条件(是 false)
			while (!status[0])
				synchronized (status) {
					// synchronized (this) {
					try {
						System.out.println(threadName + " 开始等待");
						status.wait();
						// this.wait();
						System.out.println(threadName + " 已被唤醒");
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
		} else {
			// 是管理线程,负责改变条件,并通知其它线程
			System.out.println(threadName + " 休眠" + time / 1000 + "秒");
			try {
				sleep(time);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			// Boolean[] status = { true };
			// this.setStatus(status);
			status[0] = true;
			System.out.println(threadName + " 正在唤醒其它线程");
			synchronized (status) {
				// synchronized (this) {
				status.notifyAll();
				// this.notifyAll();
			}
		}
		System.out.println(threadName + " 线程结束!");
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// main 函数放到其它的类里也能成功
		// 不成功的原因是只使用布尔值不行,
		// 需要把布尔值放到一个数组里就成了
		Boolean[] status = { false };
		ThreadABC threadA = new ThreadABC("Thread A", Boolean.FALSE, status);
		ThreadABC threadB = new ThreadABC("Thread B", Boolean.FALSE, status);
		ThreadABC threadC = new ThreadABC("Thread C", Boolean.TRUE, status);
		threadA.start();
		threadB.start();
		threadC.start();
	}
}

 

分享到:
评论

相关推荐

    c++多线程编程的十个例子

    以下是对“C++多线程编程的十个例子”的详细讲解,这些例子将帮助你在Windows环境下深入理解和应用多线程。 1. **创建线程** C++11引入了`std::thread`库来创建和管理线程。例如,你可以通过传递函数或成员函数...

    MFC多线程编程例子

    本多线程编程例子将帮助你理解如何在MFC中创建和管理线程。 1. **多线程概念** 多线程是操作系统中的一个核心概念,它允许程序同时执行多个任务。在MFC中,多线程可以用于在后台执行耗时操作,例如数据加载或网络...

    多线程编程例子

    本项目名为"多线程编程例子",旨在帮助初学者理解并实践Linux环境下的多线程编程。 首先,我们来探讨多线程的基本概念。在单线程程序中,任务是按顺序执行的,而多线程则允许多个任务同时执行,提高了系统资源的...

    linux epoll多线程编程 例子

    在多线程编程中,epoll可以配合线程池来优化性能。线程池是一种线程使用模式,预先创建一组线程,当有任务到来时,任务被分配给空闲线程处理,避免了频繁创建和销毁线程带来的开销。线程池与epoll结合,可以在多线程...

    使用多媒体定时器做多线程编程的简单例子

    在“使用多媒体定时器做多线程编程的简单例子”中,我们可以假设以下场景:一个应用程序需要周期性地执行多个独立的任务,每个任务都由一个单独的线程来完成。多媒体定时器可以用来设置一个精确的时间间隔,当到达这...

    简单的多线程编程例子

    一个非常简洁的多线程编程例子,纯C语言编写,非常适合多线程的入门

    java多线程编程-详细炒作例子

    ### Java多线程编程详解与实战案例 #### 理解多线程概念与Java内存模型 多线程,作为现代编程中的一项关键技术,允许在单一应用程序中并发执行多个指令流,每个这样的指令流被称为一个线程。在Java中,线程被视为...

    Linux 下多线程编程的详细例子

    本教程通过一个详细的例子,将深入讲解Linux下如何进行多线程编程。 首先,理解多线程的概念至关重要。在Linux中,线程是操作系统调度的基本单位,它们共享同一地址空间,这意味着线程间的通信非常高效,但同时也...

    c#多线程编程实战(原书第二版)源码

    《C#多线程编程实战(原书第二版)源码》是一本深入探讨C#中多线程技术的专业书籍,其源码提供了丰富的实践示例,帮助读者掌握并发编程的核心概念和技术。在C#中,多线程是实现高性能、响应式应用程序的关键组成部分...

    多线程编程UNIXLinux下的多线程编程.pdf

    ### 多线程编程在UNIX/Linux环境中的应用与优势 多线程编程作为一种高效的数据处理方式,在UNIX/Linux环境下得到了广泛的应用。与传统的单线程进程相比,多线程编程能够显著提升程序的性能和响应速度,尤其是在现代...

    linux下多线程编程

    Linux 下多线程编程 Linux 下的多线程编程遵循 POSIX 线程接口,称为 pthread。编写 Linux 下的多线程程序,需要使用头文件 pthread.h,连接时需要使用库 libpthread.a。 Linux 下 pthread 的实现是通过系统调用 ...

    多线程编程的入门教程

    文档开篇提出了一个单线程程序中存在的问题,即在执行耗时操作时,程序无法响应其他用户操作,从而引出多线程编程的必要性。这一节涉及了进程和线程的基本概念,说明了它们都是操作系统中用于描述程序运行状态的抽象...

    VC多线程编程概述.pdf

    ### VC多线程编程知识点详解 #### 一、引言 多线程编程在软件开发中扮演着极其重要的角色,特别是在资源密集型应用或者需要高效处理用户交互的应用中。Microsoft Visual C++(简称VC)作为一款强大的开发工具,...

    一个初步的用VB写“多线程”程序的例子(9KB)

    标题中的“一个初步的用VB写“多线程”程序的例子”表明这是一个关于...通过研究源代码,学习者可以了解如何在VB中实现并发执行任务,以及如何在图形用户界面中反映线程状态,这对理解和掌握多线程编程概念非常有帮助。

    EVC下多线程编程例子

    在Windows CE 5.0系统上,多线程编程是一个重要的概念,因为它可以充分利用处理器资源,提高程序的执行效率。 多线程编程是指在一个进程中创建多个并发执行的线程。这些线程可以并行地执行任务,从而提高应用程序的...

    易语言大漠多线程例子.rar

    这个"易语言大漠多线程例子.rar"压缩包包含了一个使用大漠插件实现多线程编程的示例项目。 多线程是现代程序设计中一个关键的概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。在易语言中,使用大漠...

    C#Socket多线程编程实例

    C# Socket多线程编程实例是一个讲解如何使用C#语言结合多线程技术来实现网络通信的具体例子。 C#(读作“看井”)是由微软公司推出的一种面向对象的编程语言,它集成于.NET框架中。C#的设计初衷是为了解决当时Sun...

    鱼刺多线程注册源码例子(鱼刺多线程稳定框架)

    在这个例子中,"鱼刺框架"可能是一个专门为多线程编程设计的开源或商业库,它提供了一系列工具和接口,帮助开发者更好地管理和协调多个并发执行的线程。 首先,我们需要理解多线程的基本概念。在计算机科学中,线程...

    Windows MFC下的多线程的基本编程例子

    在MFC中,多线程编程是一个重要的特性,允许程序同时执行多个独立的任务,提高效率和响应性。本教程将深入探讨如何在MFC下实现多线程,以及如何使用互斥、消息传递和信号量等同步机制。 一、创建MFC线程 在MFC中,...

    详细描述了Delphi多线程编程,超级简单易懂

    ### Delphi多线程编程详解 #### 一、Delphi多线程编程概述 多线程编程是现代软件开发中的关键技术之一,它能够显著提升应用程序的性能和用户体验。Delphi作为一种广泛使用的编程语言,提供了丰富的多线程支持,...

Global site tag (gtag.js) - Google Analytics