package com.atguigu.expr1;
/**
*
* 生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从电源处取走商品。
* 店员一次只能持有固定数量的产品(比如20);
* 如果生产者试图生产给多的产品,店员会叫生产者停一下,如果有空位了,再叫生产者生产产品;
* 如果店中没有产品了,店员会叫消费者等一下,等有了商品后再叫消费者来取产品;
*
* 分析:
* 1.是否是多线程问题:是 ,生产者线程,消费者线程
* 2.是否线程安全问题:是,固定的数量的产品
* 3.是否设计线程通信
*
*
*
* @author menglei
* @create 2021-07-04-9:27
*/
class Clerk{
private int productCount = 0;
public synchronized void produceProduct() {
if (productCount < 20){
notify();
productCount ++;
System.out.println(Thread.currentThread().getName() + " : 开始生产第" + productCount + "个产品");
}
else{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void consumeProduct() {
if (productCount > 0){
notify();
System.out.println(Thread.currentThread().getName() + " : 开始消费第" + productCount + "个产品");
productCount--;
}else{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Producer extends Thread{
private Clerk clerk;
public Producer(Clerk clerk) {
this.clerk = clerk;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " : 开始生产产品。。。");
while (true){
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
clerk.produceProduct();
}
}
}
class Consumer extends Thread{
private Clerk clerk;
public Consumer(Clerk clerk) {
this.clerk = clerk;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " : 开始消费产品。。。");
while (true){
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
clerk.consumeProduct();
}
}
}
public class ProductTest {
public static void main(String[] args) {
Clerk clerk = new Clerk();
Producer P1 = new Producer(clerk);
Consumer c1 = new Consumer(clerk);
Consumer c2 = new Consumer(clerk);
P1.setName("生产者1:");
c1.setName("消费者1:");
c2.setName("消费者2:");
P1.start();
c1.start();
c2.start();
}
}
生产者消费者问题
最新推荐文章于 2024-07-18 14:16:46 发布