多线程经典案例,生产者消费者问题
要求:
面包店:
展柜5个位置(只能存放5个面包)
一个线程做面包(展柜摆满将停止做面包,有面包是通知买面包)
—个线程买面包(展柜没面包时将会停止买面包,通知做面包)
代码:
面包店类:
public class Bakery {
//展柜面包数量
private int count = 0;
public synchronized void product() throws InterruptedException {
//生产面包
count++;
System.out.println("生产一个面包,还剩" + count + "个面包");
//为了效果明显,让它生产慢点((●'◡'●))
Thread.sleep(1000);
this.notifyAll();
//展柜满了,等待消费者消费
if (count == 5) {
this.wait();
}
}
public synchronized void consume() throws InterruptedException {
//有面包,消费
if (count >= 0) {
count--;
System.out.println("消费一个面包,还剩" + count + "个面包");
Thread.sleep(1000);
this.notifyAll();
}
//展柜空了,等待生产
if (count == 0) {
this.wait();
}
}
}
生产者类:
public class Productor extends Thread {
Bakery bakery;
public Productor(Bakery bakery) {
this.bakery = bakery;
}
@Override
public void run() {
try {
//循环生产
while (true) {
bakery.product();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
消费者类:
public class Consumer extends Thread{
Bakery bakery;
public Consumer(Bakery bakery) {
this.bakery = bakery;
}
@Override
public void run() {
try {
//循环消费
while (true) {
bakery.consume();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
实现:
public class BakeyTest {
public static void main(String[] args) {
//创建面包店
Bakery bakery = new Bakery();
//创建生产者(线程)
Productor productor = new Productor(bakery);
//创建消费者(线程)
Consumer consumer = new Consumer(bakery);
//生产者线程就绪
productor.start();
//消费者线程就绪
consumer.start();
}
}