public class TestPractice2 {
/*
* 线程等待唤醒机制:生产者与消费者
* 生产者和消费者轮流生产和消费
* 生产者每次生产的产品数量+剩余的产品数量不能大于1000
* 消费者每次消费不能超过剩余产品数量
*/
public static void main(String[] args) {
// 产品
Product product = new Product();
// 生产线
new Thread(new Producer(product)).start();
// 消费线
new Thread(new Consumer(product)).start();
}
}
// 生产者
class Producer implements Runnable{
private Product p;
public Producer(Product p) {
this.p = p;
}
@Override
public void run() {
while (true) {
// 开启同步锁
synchronized (p) {
// 判断标记
if (p.flag) {
try {
// 线程进入等待区 释放同步锁
p.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// max为最大生产量
int max = 1000 - p.getCount();
// i为随机生产量
int i = (int) (Math.random() * max + 1);
p.setCount(i + p.getCount());
System.out.println("生产者生产" + i + "个产品, 产品总计" + p.getCount() + "个。");
// 修改标记
p.flag = true;
// 唤醒等待区中的线程
p.notify();
}
}
}
}
// 消费者
class Consumer implements Runnable {
private Product p;
public Consumer(Product p) {
this.p = p;
}
@Override
public void run() {
while (true) {
// 开启同步锁
synchronized (p){
// 判断标记
if (!p.flag) {
try {
// 线程进入等待区 释放同步锁
p.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// i随机消费量
int i = (int) (Math.random() * p.getCount() + 1);
p.setCount(p.getCount() - i);
System.out.println("消费者消费" + i + "个产品,产品剩余" + p.getCount() + "个。");
// 修改标记
p.flag = false;
// 唤醒等待区中的线程
p.notify();
}
}
}
}
// 产品类
class Product {
// 初值为0
private int count = 0;
// 互斥标志
boolean flag = false;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}