package src.ThreadH.exercise;
/**
* @author Vince
* @create 2024-07-05-09:30
* <p>
* 案例2:生产者&消费者
* 生产者(Productor)将产品交给店员(Clerk),而消费者(customer)从店员处取走产品,店员一次只能持有
* 固定数量的产品(比如:20),如果生产者试图生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品
* 了再通知生产者继续生产,如果店中没有产品了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来
* 取走产品。
* <p>
* 共享数据:产品
* 线程:生产者 消费者
*/
public class Test3 {
public static void main(String[] args) {
Clerk clerk = new Clerk();
Productor productor = new Productor(clerk);
Customer_ customer_ = new Customer_(clerk);
Customer_ customer_1 = new Customer_(clerk);
Thread t = new Thread(productor);
t.start();
customer_.start();
customer_1.start();
}
}
class Clerk extends Thread {
public int getProduct() {
return product;
}
public void setProduct(int product) {
this.product = product;
}
private int product;
synchronized void addProduct() {
if (product >= 20) {
try {
System.out.println("目前产品存量太多,请等待");
wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
} else {
notifyAll();
System.out.println("Thread is -------> " + Thread.currentThread().getName() + "生产 product num is ---> " + (product + 1));
}
}
;
synchronized void minusProduct() {
if (product <= 0) {
try {
System.out.println("目前产品存量不够,请等待");
wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
} else if (0 < product && product <= 20) {
notifyAll();
System.out.println("Thread is -------> " + Thread.currentThread().getName() + "消费 product num is ---> " + (product - 1));
}
}
;
}
class Productor implements Runnable {
Clerk clerk;
Productor(Clerk clerk) {
this.clerk = clerk;
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("开始生产产品" + (clerk.getProduct() + 1));
clerk.addProduct();
}
}
}
class Customer_ extends Thread {
Clerk clerk;
Customer_(Clerk clerk) {
this.clerk = clerk;
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("开始消费产品------>" + (clerk.getProduct() + 1));
clerk.minusProduct();
}
}
}