Java多线程实现简单生产者消费者模式

    xiaoxiao2021-03-25  57

    生产者消费者模式

    一种重要的模式,基于等待/通知机制。生产者/消费者模式描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模式关注的是以下几个点:

    1、生产者生产的时候消费者不能消费

    2、消费者消费的时候生产者不能生产

    3、缓冲区空时消费者不能消费

    4、缓冲区满时生产者不能生产

    代码实例:

    public class LockPattern_A { static int food=10;//设定开始食物储量 Lock lock; Condition condition; public LockPattern_A(Lock lock,Condition condition) { // TODO Auto-generated constructor stub this.condition=condition; this.lock=lock; } /*生产者*/ public void producer() { try { while(food>0) { lock.lock(); /*当食物储量超过30时就唤醒消费者线程,进行消费*/ if (food>30) { System.out.println("过剩,需要消费"); condition.await(); } System.out.println("食物不够,增加食物"); System.out.println("当前食物储量"+food); food+=10;//生产者每次增加10个食物 condition.signal(); } } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } /*消费者*/ public void consume() { try { while(food>=5) { lock.lock(); /*当食物少于5个时就唤醒生产者线程进行生产*/ if (food<=5) { System.out.println("食物不够,需要生产"); condition.await(); } System.out.println("消费食物"); System.out.println("当前食物储量"+food); food-=5;//每次消费5个食物 condition.signal(); } } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public static void main(String[] args) { Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); final LockPattern_A a = new LockPattern_A(lock, condition); /*生产者线程*/ Thread t1 = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub a.producer(); } }); /*消费者线程*/ Thread t2 = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub a.consume(); } }); t1.start(); t2.start(); } }

    转载请注明原文地址: https://ju.6miu.com/read-37428.html

    最新回复(0)