/**
* 生产者-消费者案例
* 生产者;需要不停的生产商品,当商品超出库存,不能在生产
* 消费者;不停的消费商品,当库存为零,不能在消费。
* <p>
* 分析:
* 1.是否是多线程问题
* 2.是否有共享数据
* 3.如果解决线程安全问题
* 4.是否设计线程的通信
*/
//店员
class Clerk {
private int num = 0;
public synchronized void xiaoFei() {
if (num < 20) {
num++;
System.out.println(Thread.currentThread().getName() + "开始生产第" + num + "产品");
//唤醒线程
this.notify();
}else {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void shengChan() {
if (num > 0) {
System.out.println(Thread.currentThread().getName() + "消费者开始消费第" + num + "产品");
num--;
this.notify();
}else {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//生产者
class Proucer extends Thread {
private Clerk clerk;
public Proucer(Clerk clerk) {
this.clerk = clerk;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "生产者开始生产");
while (true) {
try {
sleep(110);
} catch (InterruptedException e) {
e.printStackTrace();
}
clerk.shengChan();
}
}
}
//消费者
class Consumer extends Thread {
private Clerk clerk;
Consumer(Clerk clerk, String name) {
this.clerk = clerk;
super.setName(name);
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "消费者开始消费");
while (true) {
try {
sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
clerk.xiaoFei();
}
}
}
public class Test {
public static void main(String[] args) {
Clerk clerk = new Clerk();
//生产者
Proucer p = new Proucer(clerk);
Thread p1 = new Thread(p, "迪奥");
Thread p2 = new Thread(p, "跤四大");
//消费者
Consumer c = new Consumer(clerk, "吉良吉影");
p1.start();
p2.start();
c.start();
}
}