Java实现生产者消费者模型
class Clerk {
private static int productNumber = 0;//商品的数量
private static final int MAX = 20; //最多可以有20个商品
public synchronized void addProduct() {
try {
Thread.sleep(1000); //延时,让效果更加明显
} catch (Exception e) {
e.printStackTrace();
}
if (productNumber == MAX) { //如果商品数量达到上限就停止生产
try {
System.out.printf("现在有%d个商品,生产者进入阻塞状态。\n", productNumber);
this.wait();
} catch (Exception e) {
e.printStackTrace();
}
}else{
System.out.printf("现在有%d个商品,生产后有%d个商品\n",productNumber,productNumber+1);
productNumber+=1;
}
this.notifyAll();//唤醒所有进程
}
public synchronized void consumeProduct(){
if(productNumber==0){ //如果没有商品了
System.out.printf("现在有%d个商品,消费者进入阻塞状态。\n",productNumber);
try{
this.wait();
}catch (Exception e){
e.printStackTrace();
}
}else{
System.out.printf("现在有%d个商品,消费一个后剩下%d个商品。\n",productNumber,productNumber-1);
productNumber-=1;
}
this.notifyAll();
}
}
class Productor implements Runnable{
private Clerk product;
public Productor(Clerk product){
this.product=product;
}
public void run(){
while(true){
product.addProduct();
}
}
}
class Consumer implements Runnable{
private Clerk consumer;
public Consumer(Clerk consumer){
this.consumer=consumer;
}
public void run(){
while(true) {
this.consumer.consumeProduct();
}
}
}
public class TestProductConsume{
public static void main(String[] args){
Clerk obj = new Clerk();
Productor productor = new Productor(obj);
Consumer consumer=new Consumer(obj);
Thread productThread = new Thread(productor);//创建生产者进程
Thread consumeThread = new Thread(consumer);//创建消费者进程
productThread.start();
consumeThread.start();
}
}