package com.szc.java;
/**
* @Author szc
* @Date 2021/8/24
*/
//缓冲区(售货员)
class Clerk {
private int quantity=0;
public int getQuantity() {
return quantity;
}
//当货物数量为20(满)时,唤醒消费者进程,并使得生产者进程阻塞。
public synchronized void Purchase(){
notify();
while (quantity == 20){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
quantity++;
}
//当货物数量为0时,唤醒生产者进程,并使得消费者进程阻塞。
public synchronized void Sale(){
notifyAll();
while (quantity == 0){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
quantity--;
}
}
//生产者进程
class Producer implements Runnable{
private Clerk clerk;
public Producer(Clerk clerk) {
this.clerk = clerk;
}
@Override
public void run() {
while (true) {
synchronized (clerk) {
try {
Thread.sleep(150);
} catch (InterruptedException e) {
e.printStackTrace();
}
clerk.Purchase();
int x = clerk.getQuantity();
System.out.println(Thread.currentThread().getName() + "生产了第" + x + "个产品");
}
}
}
}
//消费者进程
class Consumer implements Runnable{
private Clerk clerk;
public Consumer(Clerk clerk) {
this.clerk = clerk;
}
@Override
public void run() {
while (true) {
synchronized (clerk) {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
clerk.Sale();
int x = clerk.getQuantity()+1;
System.out.println(Thread.currentThread().getName() + "消费了第" + x + "个产品");
}
}
}
}
//主函数
public class Pipeline {
public static void main(String[] args) {
Clerk clerk = new Clerk();
Producer producer = new Producer(clerk);
Consumer consumer = new Consumer(clerk);
Thread p1 = new Thread(producer);
Thread c1 = new Thread(consumer);
Thread c2 = new Thread(consumer);
p1.setName("生产者1");
c1.setName("消费者1");
c2.setName("消费者2");
p1.start();
c1.start();
c2.start();
}
}
生产者消费者模式Java实现
最新推荐文章于 2022-03-10 14:48:23 发布