使用wait()和notifyAll()实现生产者消费者模型

使用wait()和notifyAll()实现生产者消费者模型

下面将实现三个类,Generater为生产者,Consumer为消费者,Taobao为中间平台。给出代码。

生产者Generater:

package generater_and_consumer;

public class Generater implements Runnable{
    private Taobao taobao;
    public Generater(Taobao taobao) {
          this.taobao=taobao;
	}
	@Override
	public void run() {
		while(true){
			taobao.push();
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

消费者Consumer:

package generater_and_consumer;

public class Consumer implements Runnable{
     private Taobao taobao;
     public Consumer(Taobao taobao) {
		this.taobao=taobao;
	}
	@Override
	public void run() {
		while(true){
			taobao.take();
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
     
}

中间平台Taobao:

package generater_and_consumer;

public class Taobao {
       private int count;
       public final int MAX_COUNT=10;
       public synchronized void push(){
    	   while(count>=MAX_COUNT){
    		   try {
    			   System.out.println(Thread.currentThread().getName()+"数量达到上限,生产者暂停生产");
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
    	   }
    	   count++;
    	   System.out.println(Thread.currentThread().getName()+"生产者生产,当前库存为:"+count);
    	   notifyAll();
       }       
       public synchronized void take(){
    	   while(count<=0){
    		   try {
    			   System.out.println(Thread.currentThread().getName()+"当前库存为零,消费者等待中");
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
    	   }
    	   count--;
    	   System.out.println(Thread.currentThread().getName()+"消费者消费了,当前库存为"+count);
    	   notifyAll();
       }
       
}

最后编写测试类进行测试:

package generater_and_consumer;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Test {
       public static void main(String[] args) {
		Taobao taobao=new Taobao();
		Generater g=new Generater(taobao);
		Consumer c=new Consumer(taobao);
		
	    new Thread(g).start();
	    new Thread(g).start();
	    new Thread(g).start();
	    
	    new Thread(c).start();

	}
}

贴出部分实验结果:

Thread-0生产者生产,当前库存为:1
Thread-1生产者生产,当前库存为:2
Thread-3消费者消费了,当前库存为1
Thread-2生产者生产,当前库存为:2
Thread-1生产者生产,当前库存为:3
Thread-0生产者生产,当前库存为:4
Thread-2生产者生产,当前库存为:5
Thread-3消费者消费了,当前库存为4
Thread-1生产者生产,当前库存为:5
Thread-3消费者消费了,当前库存为4
Thread-2生产者生产,当前库存为:5
Thread-0生产者生产,当前库存为:6
Thread-1生产者生产,当前库存为:7
Thread-3消费者消费了,当前库存为6
Thread-2生产者生产,当前库存为:7
Thread-0生产者生产,当前库存为:8
Thread-1生产者生产,当前库存为:9
Thread-2生产者生产,当前库存为:10
Thread-3消费者消费了,当前库存为9
Thread-0生产者生产,当前库存为:10
Thread-1数量达到上限,生产者暂停生产
Thread-3消费者消费了,当前库存为9
Thread-2生产者生产,当前库存为:10
Thread-1数量达到上限,生产者暂停生产
Thread-0数量达到上限,生产者暂停生产
Thread-2数量达到上限,生产者暂停生产
Thread-3消费者消费了,当前库存为9
Thread-2生产者生产,当前库存为:10
Thread-0数量达到上限,生产者暂停生产
Thread-1数量达到上限,生产者暂停生产
Thread-3消费者消费了,当前库存为9
Thread-1生产者生产,当前库存为:10
Thread-0数量达到上限,生产者暂停生产
Thread-2数量达到上限,生产者暂停生产


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值