下面我们通过一个例子来理解和学习关于JAVA线程 wait() nodify()。
先说说例子的整体思路和角色介绍,有一个仓库里面装着产品,有专门管销售的,有专门管生产的。
生产的和销售的都对应这个仓库,生产部的生产出一件产品就往仓库仍一件,销售的需要产品了,就直接上仓库拿去。
当销售部的去仓库拿货发现没有货了,就通知销售部门的人,都别来拿货了(wait()),当生产部生产出一定量的产品后
通知销售的,有货了去拿货吧(nodify())。然后就这样一直反复的生产和销售着。
好了,事情的来龙去脉已经搞清楚了。
这件事情有3个角色,仓库,销售部,生产部。下面来看代码吧。
仓库类
package thread;
/**
* 仓库类
*/
public class ArrayBuffer {
// 产品的数量
public int pnum=0;
/**
* 增加产品数量
* @param value
* @throws InterruptedException
*/
public synchronized void put(int value)throws InterruptedException{
System.out.println("生产了一件产品 当前库存:" + ++pnum);
}
/**
* 减少产品数量
* @return
* @throws InterruptedException
*/
public synchronized int get() throws InterruptedException{
if(pnum==0){
System.out.println("没有货了,停止销售。");
wait();
return 0;
}
this.notify();
System.out.print("正在销售了一件产品");
System.out.println("销售了一件产品...当前库存:" + --pnum);
return 1;
}
}
生产类
package thread;
/**
* 生产类
*/
public class Producer extends Thread{
private ArrayBuffer c;
public Producer(ArrayBuffer cc){
this.c=cc;
}
public void run() {
int i;
for(i=0;true;i++){
try {
Thread.sleep(500); //生产速度
c.put(i);
if(c.pnum >= 20) //货源到达一定数时 通知开始销售
synchronized (c) {
c.notify();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
销售类
package thread;
/**
* 销售类
*/
public class Consumer extends Thread{
private ArrayBuffer c;
public Consumer(ArrayBuffer cc){
this.c=cc;
}
public void run(){
int i;
for(i=0;true;i++){
try {
Thread.sleep(300); //销售速度
c.get();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
主的运行类,启动这套业务。
package thread;
/**
* @author Administrator
* wait , nodify方法的 理解测试。 一个生产和销售的例子
* 销售线程 发现库存没货时 使用wait方法 将锁释放,这时候生产线程独立运行,当生产数达到20
* 后,使用nodify方法 唤醒销售线程继续销售。
*/
public class MyPcTest {
public static void main(String args[]) throws InterruptedException {
ArrayBuffer c=new ArrayBuffer();
Producer p=new Producer(c);
p.setName("生产");
Consumer consumer=new Consumer(c);
consumer.setName("销售");
p.start();
consumer.start();
}
}
分享到:
相关推荐
电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...
Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解
Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程
Java线程Java线程Java线程Java线程Java线程Java线程
java 线程安全的几个测试小例子,充分的理解JMM中的线程内存模型
Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 ...
Java 模拟线程并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发
Java 线程图形化理解,可以方便的了解java线程的使用特点!解压开然后就可以直接的点击查看Java线程的显示效果
java线程 线程 教程 java线程教程 java线程学习资料 本教程有什么内容? 本教程研究了线程的基础知识— 线程是什么、线程为什么有用以及怎么开始编写使用线程的简单 程序。 我们还将研究更复杂的、使用线程的应用...
java 线程java 线程java 线程java 线程java 线程java 线程java 线程java 线程java 线程
Java线程中wait、await、sleep、yield、join用法汇总,文章里面总结了这些关键字的用法,并且里面带有源码帮助分析用法,此一文就可以理解这些关键字用法,推荐拥有
Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的统计信息,提供关于锁定监视器...
Java 线程系列博文总结word化,编目如下,欢迎互相学习交流: Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:...
Java线程模块Java线程之秒表新手学习Java线程模块时,利用Java中设置线程的暂停间隔,做的简易秒表
在分析Java 多线程特性的基础上, 探讨了Java 多线程的测试策略及测试方法, 提出Java 多线程测试由类测试、集成模块测试和系统测试三个层次组成, 并讨论了多线程的继承测试、同步测试以及效率测试。
Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释 3 四、线程的状态转换和生命周期 4 Java线程:创建与启动 7 Java线程:线程名称的设定及获取 10 Java...
java线程同步java线程同步java线程同步
分析java线程日志的工具,使用jstack把java线程日志dump下来,然后上传到该工具,就可以查看线程阻塞情况等信息。
java线程.pdf java 学习java
java 线程 新手java 线程 新手java 线程 新手java 线程 新手