wait()使当前线程进入阻塞状态,并释放锁,必须等待唤醒notify
package com.zhy;
class Consumer extends Thread{
int i=10;
Object obj;
public void setObj(Object obj) {
this.obj = obj;
}
@Override
public void run() {
synchronized(obj){
while(true){
if(i>0){
System.out.println("用户在吃包子");
i--;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else {
try {
System.out.println("包子不够了");
obj.notify();
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
i=10;
}
}
}
}
}
class Male extends Thread{
Object obj;
public void setObj(Object obj) {
this.obj = obj;
}
@Override
public void run() {
while(true){
synchronized(obj){
System.out.println("师傅正在做包子");
obj.notify();
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public class TestThread {
public static void main(String[] args) {
Object obj=new Object();
Consumer consumer=new Consumer();
Male male=new Male();
consumer.setObj(obj);
male.setObj(obj);
consumer.start();
male.start();
}
}
用户在吃包子
用户在吃包子
用户在吃包子
用户在吃包子
用户在吃包子
用户在吃包子
用户在吃包子
用户在吃包子
用户在吃包子
用户在吃包子
包子不够了
师傅正在做包子
用户在吃包子
用户在吃包子
用户在吃包子
用户在吃包子
用户在吃包子
用户在吃包子
用户在吃包子
用户在吃包子
用户在吃包子
用户在吃包子
包子不够了
师傅正在做包子
** 一开始消费者进程进入就绪状态,分到时间片,开始执行,并且占有obj这个锁,生产者线程进不去方法,当消费者没有东西可消费时,唤醒生产者进程,进入阻塞状态,并释放锁,此时在进程调度中心中只有生产者进程可以运行,由于obj锁已经被释放,则生产者方法可以占用,执行生产物品功能,唤醒阻塞进程,并进入阻塞状态,则此时,消费者可以进行消费
**