每次生产一个随机数量的商品,保证每次生产之后总的剩余商品数量不能超过1000.每次消费一个随机数量的商品,消费最大量是总的剩余商品数量。生产和消费交替出现
package cn.tedu.thread;
public class WaitNotifyDemo {
public static void main(String[] args) {
//商品类对象
Product p=new Product();
//创建线程对象
new Thread(new Productor(p)).start();
new Thread(new Consumer(p)).start();
}
}
//定义类--代表线程执行的任务信息(生产者)
class Productor implements Runnable{
//声明商品类的对象
private Product p;
//有参构造--保证共享同一个商品类的对象
public Productor(Product p){
this.p=p;
}
//生产过程
@Override
public void run() {
//保证一直生产下去
while (true) {
synchronized (p) {
//保证第一次执行时生产者不等待
if (p.getFlag()==true)
//让线程对象进行等待
try {
p.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
//可以生产的最大值
int max = 1000 - p.getCount();
//随机生产的商品数量
int count = (int) (Math.random() * (max + 1));
//设置新的剩余的商品数量
p.setCount(p.getCount() + count);
//输出
System.out.println("生产了" + count + "个商品,还剩"
+ p.getCount() + "个商品");
//唤醒等待的线程对象(消费者)
p.notify();
//改变布尔值
p.setFlag(true);
}
}
}
}
//定义类--代表线程执行任务信息(消费者)
class Consumer implements Runnable{
//声明商品类的对象
private Product p;
//有参构造--保证共享同一个商品类的对象
public Consumer(Product p){
this.p=p;
}
//指定消费者过程
@Override
public void run() {
while (true) {
synchronized (p) {
//
if (p.getFlag()==false)
//线程对象等待
try {
p.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
//随机消费的商品数量
int count = (int) (Math.random() * (p.getCount() + 1));
//设置新的剩余商品数量
p.setCount(p.getCount() - count);
//输出
System.out.println("消费了" + count + "个商品,还剩"
+ p.getCount() + "个商品");
//唤醒等待的线程对象(生产者)
p.notify();
//改变布尔值
p.setFlag(false);
}
}
}
}
//代表商品的类
class Product{
//属性--商品数量
private int count;
//标志位
private boolean flag;
public boolean getFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}