一、关于Object类中的wait方法和notify方法
————生产者和消费者模式
1、wait和notify方法不是线程对象的方法,也不是通过线程对象调用的。它是Java中任何一个Java对象都有的方法,因为这两个方法是Object类中自带的。
2、wait方法的作用:Object o = new Object();
o.wait();
表示:让“正在o对象上活动的线程”(当前线程)进入等待状态,无期限等待,直到被唤醒为止
3、notify方法作用:Object o = new Object();
例如: o.notify();
表示:唤醒正在o对象上等待的线程。
还有一个notifyAll方法:是唤醒o对象上处于等待的所有线程。
二、wait方法和notify方法的代码实现
案例如下所示:
模拟的要求:
* 仓库我们采用list集合
* list集合中假设只能存储一个元素,一个元素就表示仓库已经满了。
* 如果list集合个数为0,就表示仓库空了
import java.util.ArrayList;
import java.util.List;
/*
* 模拟的要求:
* 仓库我们采用list集合
* list集合中假设只能存储一个元素,一个元素就表示仓库已经满了。
* 如果list集合个数为0,就表示仓库空了
*/
public class test03{
public static void main(String args[])throws Exception{
//1、创建一个仓库对象,共享的
List list = new ArrayList();
//创建两个线程对象
//生产者线程
Thread t1 = new Thread(new Producer(list));
//消费者线程
Thread t2 = new Thread(new Consumer(list));
t1.setName("生产者生产:");
t2.setName("消费者消费:");
t1.start();
t2.start();
}
}
//生产者
class Producer implements Runnable{
private List list;
public Producer(List list){
this.list = list;
}
@Override
public void run() {
//一直生产,(利用死循环模拟一道生产)
while (true){
//给仓库对象list加锁
synchronized (list){
if (list.size()>0){ //大于0,说明仓库list中已有一个元素
try {
//当前线程进入等待状态,并且释放Producer之前占有的list集合的锁
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//程序能够执行到这里说明仓库是空的,可以生产
Object obj = new Object();
list.add(obj);
System.out.println(Thread.currentThread().getName()+"----->"+obj);
//唤醒消费者消费
list.notifyAll();
}
}
}
}
//消费者
class Consumer implements Runnable{
private List list;
public Consumer(List list){
this.list = list;
}
@Override
public void run() {
//一直消费
while (true){
synchronized (list){
if (list.size()==0){
//仓库已经空了,消费者线程等待
//释放掉list集合 的锁
try {
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//程序能够实现到这里,说明仓库中已有数据,可以消费了
Object obj = list.remove(0);
System.out.println(Thread.currentThread().getName()+"---->"+obj);
//唤醒生产者生产
list.notifyAll();
}
}
}
}
执行结果:
生产者生产:----->[1]
消费者消费:---->1
生产者生产:----->[1]
消费者消费:---->1
如果你觉得博主的文章的不错或者对你有帮助,可以点一个免费的关注支持一下博主,你的鼓励将是我创作的最大动力!!