下面我们通过一个例子来理解和学习关于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();
}
}
分享到:
相关推荐
Java线程状态流转图知识点总结 Java线程状态流转图是一种用于描述Java线程生命周期中不同的状态和状态...通过了解Java线程状态流转图,我们可以更好地理解Java线程的生命周期,并提高Java多线程编程的效率和可靠性。
总之,理解Java内存模型和掌握线程安全策略对于开发高效、可靠的并发程序至关重要。开发者应始终关注线程安全,确保在多线程环境下代码的正确性和稳定性。在实际项目中,可以参考提供的"ThreadSaft"文件中的测试例子...
总之,Java线程是并发编程的基础,理解和掌握线程的生命周期、实现方式和同步机制对于编写高效、安全的多线程程序至关重要。在实际应用中,根据需求选择合适的线程实现策略,并结合同步机制,可以有效地利用系统资源...
以上就是对Java线程中wait、await、sleep、yield、join用法的总结。这些方法在实际开发中,对于控制多线程运行的时序和协调非常关键。理解这些方法的正确使用方式是掌握Java并发编程的基础。同时,使用时需特别注意...
Java多线程测试工具在软件开发中扮演着至关重要的角色,尤其在性能优化和系统压力测试方面。本文将深入探讨Java多线程测试工具的重要性和使用,以"JMeter"为例,来阐述如何通过此类工具进行高效的压力测试和系统瓶颈...
在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这意味着所有类都默认继承了这两个方法。本文将详细探讨如何使用 `wait()` 和 `notify()` 来控制子线程...
Java线程的深入理解和熟练掌握是Java程序员必备的技能,它涉及到程序的性能优化、并发控制和安全性,是开发复杂多线程应用的基础。在实际开发中,合理使用线程同步机制和理解线程调度原理,可以有效避免死锁、活锁等...
Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的统计信息,提供关于锁定监视器...
线程间的通信主要依赖于共享内存和线程同步机制,如`synchronized`关键字、`wait()`, `notify()` 和 `notifyAll()` 方法。虽然线程可以充分利用多核处理器的优势,但线程切换带来的开销(上下文切换)以及可能出现的...
在本文中,我们将通过示例代码详细介绍Java多线程wait和notify的使用,帮助读者更好地理解和掌握这两个机制。 wait机制 在Java中,wait机制用于暂停当前线程的执行,并释放当前对象的锁,以便让其他线程获得锁并...
在Java中,线程间的通信可以通过wait()、notify()和notifyAll()方法实现,这些方法需要在synchronized代码块或方法中调用,以确保线程安全。另外,`java.util.concurrent`包中的BlockingQueue是一个高效的线程间通信...
Java多线程是Java编程中的重要组成部分,尤其在并发编程领域,它扮演着...这个"java多线程测试实例"可能包含了上述部分或全部知识点的实际应用,通过下载并分析实例代码,可以加深对Java多线程编程的理解和实践能力。
《Java线程》这本书是Java开发人员深入理解并发编程的重要参考资料。Java作为一种广泛使用的编程语言,其并发处理能力是高效程序设计的关键。本电子书详细介绍了如何在Java环境中有效地使用多线程,优化程序性能,并...
本文将深入探讨Java线程的核心概念、API以及在实际开发中的应用,旨在帮助你理解和掌握这一关键技能。 首先,我们需要了解什么是线程。在单核CPU系统中,线程是操作系统调度的基本单位,而在多核CPU系统中,每个...
线程在Java编程中扮演着至关重要的角色,它是程序中的执行单元,允许应用程序同时执行多个任务。本课程将深入探讨线程的基础知识,包括如何创建线程、理解线程的状态以及如何有效地管理线程资源,特别是通过线程池来...
本书《java线程与并发实践编程》由Jeff Friesen撰写,2017年2月出版,提供了关于Java线程API和并发工具的详细指南,帮助开发者深入理解和应用这些关键概念。 首先,Java线程是程序执行的独立路径,每个线程都有自己...
在分析Java 多线程特性的基础上, 探讨了Java 多线程的测试策略及测试方法, 提出Java 多线程测试由类测试、集成模块测试和系统测试三个层次组成, 并讨论了多线程的继承测试、同步测试以及效率测试。
Java线程是Java编程语言中的一个核心概念,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,线程是通过类`Thread`或实现`Runnable`接口来创建和管理的。Java线程模型是基于操作系统的原生...
在本项目中,“Java多线程测试程序”利用了这一特性,结合图形用户界面(GUI)框架JFrame,实现了企鹅在界面上的动态移动效果。 首先,我们来深入理解Java多线程。在Java中,每个运行的程序都有一个主线程,而多...
### Java线程培训资料知识点详解 #### 一、Java线程基本概念 ...通过以上知识点的学习,可以深入理解Java线程的基本概念、API使用以及Concurrent包中的高级特性,这对于开发高效、稳定的多线程应用程序至关重要。