关于多线程,理解上不难,做出来真不容易。
作业题是这样的:做三个线程(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++多线程的十个例子,学习window下多线程编程
linux epoll多线程编程 例子
一个非常简洁的多线程编程例子,纯C语言编写,非常适合多线程的入门
java多线程编程详解 里面具有详细的沼泽实例。
Linux 下多线程编程的详细例子,对父进程,子线程分别编写了详细模块!很好的学习资料!
.NET多线程编程教程,_NET多线程编程实例.NET多线程编程教程,_NET多线程编程实例.NET多线程编程教程,_NET多线程编程实例
Windows MFC下的多线程的基本编程例子,多达10个左右,涉及互斥、消息传递、信号量的使用,适合刚接触线程编程的人。
EVC下多线程编程例子演示的例子,win ce 5.0 测试通过
多线程编程是一个很有意思也很有用的技术,使用多线程技术的网络蚂蚁是目前最常用的下载工具之一,使用多线程技术的grep比单线程的grep要快上几倍,类似的例子还有很多。希望大家能用多线程技术写出高效实用的好程序...
C#多线程的一个例子 1.带参数的多线程 2.处理了UI元素的控制
MFC多线程小例,非常简单易于理解 含有源程序和程序建立的步骤说明
多线程编程多线程编程多线程编程多线程编程多线程编程
主要功能:多线程编程实例包含了大量的多线程的例子,通过这些例子能对多线程有更深刻的理解。
linux多线程编程 声明:本文是网上整理的资料,版权属其作者本人所有。 1 第一章 线程基础知识 2 一.什么是线程 2 二.线程的优点 2 三.线程的缺点 2 四.线程的结构 2 五.线程标识 2 六.线程的创建 3 七..线程...
linux多线程编程测试例子
这是QT TCP多线程编程的例子,开启多个客户端可以从服务器中取得不同的数据。
C++多线程编程入门教程,讲解了多线程的概念,并且给出了linux和windows平台下多线程实现的例子。。
一个在linux平台下的多线程视频解析程序,程序比较简单,适合初学者熟悉linux平台的多线程开发。这也是我大二时学习所做的入门级的程序,提供给各位初学者参考。
一个初步的用VB写“多线程”程序的例子(9KB)
JAVA多线程编程(详细操作例子)(低分分享).doc