线程的wait和notify方法示例(生产者和消费者)
来源:互联网 发布:手机数据恢复免费软件 编辑:程序博客网 时间:2024/05/22 11:56
一. java Thread类的几个函数的说明:
1. setPriority( ): 设置线程的优先权;
2 . yield( ): 暂停线程的执行,给其它具有相同优先权的线程执行的机会,若此时没有其它线程执行,则此线程继续执行。这个函数并不会释放锁住的对象。
3. join( ): 等待加入的线程执行完毕才会执行下一个线程。加入的线程通过interrupt( )来唤醒。
4. wait( ): 类似sleep( ), 不同的是,wait( )会先释放锁住的对象,然后再执行等待的动作。注意,这个函数属于Object类。另外,由于wait( )所等待的对象必须先锁住,因此,它只能用在同步化程序段或者同步化方法内,否则,会抛出异常IllegalMonitorStateException.
二. 例子:
下面,仅对于wait( ) 和notify( )函数进行测试。
这个例子向读者展示了生产者--消费者关系。
代码:
import java.util.Vector;
public class ThreadWaitNotifyTest {
public static void main(String args[]) {
Vector obj = new Vector();
Thread consumer = new Thread(new Consumer(obj));
Thread producter = new Thread(new Producter(obj));
consumer.start();
producter.start();
}
}
/*消费者 */
class Consumer implements Runnable {
private Vector obj;
public Consumer(Vector v) {
this.obj = v;
}
public void run() {
synchronized(obj) {
while (true) {
try {
if (obj.size() ==0){
obj.wait();
}
System.out.println("Consumer:goods have been taken");
System.out.println("obj size: " + obj.size());
obj.clear();
obj.notify();
}
catch(Exception e) {
e.printStackTrace();
}
}
}
}
}
/* 生产者 */
class Producter implements Runnable {
private Vector obj;
public Producter(Vector v) {
this.obj = v;
}
public void run() {
synchronized(obj) {
while (true) {
try {
if (obj.size() !=0){
obj.wait();
}
obj.add(new String("apples"));
obj.notify();
System.out.println("Producter:obj are ready");
Thread.sleep(500);
}
catch(Exception e) {
e.printStackTrace();
}
}
}
}
}
三. 测试结果:
--------------------Configuration: <Default>--------------------
Producter:obj are ready
Consumer:goods have been taken
obj size: 1
Producter:obj are ready
Consumer:goods have been taken
obj size: 1
Producter:obj are ready
Consumer:goods have been taken
obj size: 1
Producter:obj are ready
Consumer:goods have been taken
obj size: 1
Producter:obj are ready
Consumer:goods have been taken
Process interrupted by user.
四. 说明:
1. 生产者--消费者,二者共享数据goods(vector对象),这里,生产者是Producter, 消费者是Consumer。生产者负责放物品到goods中,消费者使用wait( )等待生产者的通知。当得到通知后,消费者取出物品,并且用notify( )通知生产者,可以再放下一批物品。
- 线程的wait和notify方法示例(生产者和消费者)
- wait和notify实现的生产者消费者线程交互
- java线程的wait方法和notify方法的运用(包含生产者消费者代码【已练习】)
- 多线程--生产者消费者问题(wait和notify方法)
- 多线程五,线程间通信3,wait、notify,notifyAll方法,生产者和消费者问题(14,毕向东老师)
- 生产者消费者例子-采用wait()和notify()
- 浅谈生产者消费者问题中的wait()和notify()的使用
- 通过wait和notify实现的生产者消费者demo【转载】
- 基于wait和notify的生产者消费者实例
- 多线程生产者消费者模式(wait()和notify())
- 生产者 消费者 (wait notify)
- 使用wait和notify来实现生产者和消费者
- 线程学习二,notify和wait实现消费者-生产者同步问题
- 基于线程实现的生产者消费者模型(Object.wait(),Object.notify()方法)
- Java多线程通信-利用传统的线程通信wait(),notify()方法实现“生产者消费者模式”
- 使用Object类中的wait()和notify()方法实现生产者和消费者模式
- 线程通信(生产者消费者问题)、wait()与notify()方法详解
- 用wait和notify/notifyAll实现生产者消费者模式
- ThreadPoolExecutor 一图
- Oracle学习笔记(九) 查询语句
- oracle 常用系统表
- 线性表——顺序表——时间复杂度计算2
- python 读取文件
- 线程的wait和notify方法示例(生产者和消费者)
- Jenkins~通过WebDeploy实现自动部署
- 51nod1051_DP求最大子矩阵
- Mac中安装与配置Mysql+Navicat中文乱码问题
- 最全Pycharm教程(26)——Pycharm搜索导航之文件名、符号名搜索
- 51nod 1557 两个集合(二分)
- 服务器之间使用ssh免密登录
- 在树莓派上通过usb_cam将图像传输到笔记本电脑
- css3选择器