时间:2021-05-20
本文实例讲述了Java基于Lock的生产者消费者模型。分享给大家供大家参考,具体如下:
前面一篇《Java锁机制Lock用法》简单介绍了锁机制,这里进一步分析一下基于lock的生产者消费者模型。
package com.expgiga.JUC;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 生产者消费者案例 */public class TestProductorAndConsumerForLock { public static void main(String[] args) { Clerk clerk = new Clerk(); Productor productor = new Productor(clerk); Consumer consumer = new Consumer(clerk); new Thread(productor, "生产者A").start(); new Thread(consumer, "消费者B").start(); new Thread(productor, "生产者C").start(); new Thread(consumer, "消费者D").start(); }}//店员class Clerk { private int product = 0; private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); //进货方法 public void get() { lock.lock(); try { while (product >= 1) { //为了避免虚假唤醒,应该总是使用在循环中 System.out.println("产品已满!"); try { condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName() + " : " + ++product); condition.signalAll(); } finally { lock.unlock(); } } //卖货方法 public void sale() { lock.lock(); try { while (product <= 0) { System.out.println("产品缺货!"); try { condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName() + " : " + --product); condition.signalAll(); } finally { lock.unlock(); } }}//生产者class Productor implements Runnable { private Clerk clerk; public Productor(Clerk clerk) { this.clerk = clerk; } @Override public void run() { for (int i = 0; i < 20; i++) { try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } clerk.get(); } }}//消费者class Consumer implements Runnable { private Clerk clerk; public Consumer(Clerk clerk) { this.clerk = clerk; } @Override public void run() { for (int i = 0; i < 20; i++) { clerk.sale(); } }}运行结果:
产品缺货!
产品缺货!
生产者A : 1
消费者B : 0
产品缺货!
产品缺货!
生产者C : 1
消费者B : 0
产品缺货!
产品缺货!
生产者A : 1
消费者B : 0
产品缺货!
产品缺货!
生产者C : 1
消费者B : 0
产品缺货!
产品缺货!
生产者A : 1
消费者B : 0
产品缺货!
产品缺货!
生产者C : 1
消费者B : 0
产品缺货!
产品缺货!
生产者A : 1
消费者B : 0
产品缺货!
产品缺货!
生产者C : 1
消费者B : 0
产品缺货!
产品缺货!
生产者A : 1
消费者B : 0
产品缺货!
产品缺货!
生产者C : 1
消费者B : 0
产品缺货!
产品缺货!
生产者A : 1
消费者B : 0
产品缺货!
产品缺货!
生产者C : 1
消费者B : 0
产品缺货!
产品缺货!
生产者A : 1
消费者B : 0
产品缺货!
产品缺货!
生产者C : 1
消费者B : 0
产品缺货!
产品缺货!
生产者A : 1
产品已满!
消费者B : 0
产品缺货!
产品缺货!
生产者C : 1
消费者B : 0
产品缺货!
产品缺货!
生产者C : 1
产品已满!
消费者B : 0
产品缺货!
产品缺货!
生产者A : 1
消费者B : 0
产品缺货!
产品缺货!
生产者C : 1
消费者B : 0
产品缺货!
产品缺货!
生产者A : 1
消费者B : 0
产品缺货!
生产者C : 1
消费者D : 0
产品缺货!
生产者A : 1
消费者D : 0
产品缺货!
生产者C : 1
消费者D : 0
产品缺货!
生产者A : 1
消费者D : 0
产品缺货!
生产者C : 1
消费者D : 0
产品缺货!
生产者A : 1
消费者D : 0
产品缺货!
生产者C : 1
消费者D : 0
产品缺货!
生产者A : 1
消费者D : 0
产品缺货!
生产者C : 1
消费者D : 0
产品缺货!
生产者A : 1
消费者D : 0
产品缺货!
生产者C : 1
消费者D : 0
产品缺货!
生产者A : 1
消费者D : 0
产品缺货!
生产者C : 1
消费者D : 0
产品缺货!
生产者A : 1
消费者D : 0
产品缺货!
生产者C : 1
消费者D : 0
产品缺货!
生产者A : 1
消费者D : 0
产品缺货!
生产者C : 1
消费者D : 0
产品缺货!
生产者A : 1
消费者D : 0
产品缺货!
生产者C : 1
消费者D : 0
产品缺货!
生产者A : 1
消费者D : 0
更多java相关内容感兴趣的读者可查看本站专题:《Java进程与线程操作技巧总结》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
1、生产者消费者模型作用和示例如下:1)通过平衡生产者的生产能力和消费者的消费能力来提升整个系统的运行效率,这是生产者消费者模型最重要的作用2)解耦,这是生产者
一、生产者消费者模型介绍1.1为什么需要使用生产者消费者模型生产者是指生产数据的任务,消费者是指消费数据的任务。当生产者的生产能力远大于消费者的消费能力,生产者
生产者消费者模型生产者:生产任务的个体;消费者:消费任务的个体;缓冲区:是生产者和消费者之间的媒介,对生产者和消费者解耦。当缓冲区元素为满,生产者无法生产,消费
概述对于多线程程序来说,生产者和消费者模型是非常经典的模型。更加准确的说,应该叫“生产者-消费者-仓库模型”。离开了仓库,生产者、消费者就缺少了共用的存储空间,
本文实例讲述了Java生产者消费者模式。分享给大家供大家参考,具体如下:java的生产者消费者模式,有三个部分组成,一个是生产者,一个是消费者,一个是缓存。这么