生产者要做的动作就是:
如果的商品,就停止生产(wait())让出锁,等待notiry()或notiryAll()的唤醒。不会进入就绪状态。我个人的理解就是生产者没有收到“没有商品”的通知,就算抢到锁,也不会生产商品。这样就浪费了资源。
没有商品,就生产商品,生产完商品就通知消费者开始消费(notify() 或 notiryAll())。
消费者要做的动作是:
如果有商品,就消费商品。消费完了,没有商品,就唤醒生产者开始生产商品。
如果没有商品,就等待。
package myThread;
class Baozi {
String name;
int price;
boolean flag; //true 有包子
}
class Producer1 implements Runnable{
Baozi baozi;
int x;
public Producer1(Baozi baozi) {
this.baozi = baozi;
}
@Override
public void run() {
while(true){
synchronized(baozi){
if(baozi.flag){
try {
baozi.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(x % 2 == 0){
baozi.name = "菜包子";
baozi.price = 2;
}else {
baozi.name = "肉包子";
baozi.price = 4;
}
x++;
baozi.flag = true;
baozi.notify();
}
}
}
}
class Consumer implements Runnable {
Baozi baozi;
public Consumer(Baozi baozi) {
this.baozi = baozi;
}
@Override
public void run() {
while(true){
synchronized(baozi){
if(!baozi.flag){
try {
baozi.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(baozi.name + "-----------" + baozi.price);
baozi.flag = false;
// 消费完商品,开始通知baozi对象锁的线程
baozi.notify();
}
}
}
}
public class ProducerAndConsumer {
public static void main(String[] args){
// 包子是两个线程共享的资源
Baozi baozi = new Baozi();
Producer1 producer1 = new Producer1(baozi);
Consumer consumer = new Consumer(baozi);
Thread thread = new Thread(producer1);
Thread thread1 = new Thread(consumer);
thread1.start();
thread.start();
}
}