import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class 管程法 {public static void main(String[] args) {SynContainer container = new SynContainer();new Productor(container).start();new Consumer(container, "one").start();new Consumer(container, "two").start();}}//生产者,将数据存入临界资源
class Productor extends Thread {int j = 0;SynContainer container;public Productor(SynContainer container) {this.container = container;}public void run() {for (int i = 0; i < 100; i++) {container.push(new Data(j));System.out.println("生产第" + (j) + "个馒头");j++;}}
}//消费者,将数据从临界资源中取出
class Consumer extends Thread {SynContainer container;String a;public Consumer(SynContainer container, String a) {this.container = container;this.a = a;}public void run() {for (int i = 1; i < 100; i++) {Data b=container.pop();System.out.println("消费者" + a + "消费第" + (b.i) + "个馒头");}}
}//管程
class SynContainer {final Lock lock = new ReentrantLock();final Condition condition1 = lock.newCondition();final Condition condition2 = lock.newCondition();private Data[] datas = new Data[10]; // 临界资源private int count =0;// 计数器
//存public void push(Data data) {lock.lock();//取得锁// 临界资源存满时阻塞if (count == datas.length) {try {condition1.await();// 线程阻塞(用await不能用wait,否则会报错),阻塞时释放锁} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}datas[count] = data;count++;condition2.signalAll(); // 存在数据,通知消费者可消费lock.unlock();//释放锁}//取public synchronized Data pop() {lock.lock();// 临界资源中无数据时阻塞if (count<=0) {try {/* 线程阻塞,会释放lock锁,但不会释放synchronized锁,所以同一时刻只能出现一个消费者被阻塞的情况,避免同时激活两个消费者消费剩下的一个商品而报错*/condition2.await();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}Data a=datas[count-1];datas[count-1]=null;count--;condition1.signalAll();// 存在空间,通知生产者可生产lock.unlock();//释放锁return a;}
}//产品
class Data {int i;public Data( int i) {this.i = i;}
}

java实现基于管程法的消费者生产者模式(两个消费者一个生产者)相关推荐

  1. 三、操作系统——生产者-消费者问题(两个同步一个互斥)

    一.问题描述 信号量机制实现进程互斥的步骤: 设置初值为1的互斥信号量 在访问临界区之间进行P操作 在访问完临界区之后进行V操作 信号量机制实现进程同步的步骤: 设置初值为0的同步信号量 在前操作之后 ...

  2. 【每天一个java设计模式(二十三)】 - 访问者模式

    在访问者模式中,我们使用了一个访问者类,它改变了元素类的执行算法.通过这种方式,元素的执行算法可以随着访问者改变而改变.这种类型的设计模式属于行为型模式.根据模式,元素对象已接受访问者对象,这样访问者 ...

  3. 【每天一个java设计模式(十五)】 - 命令模式

    命令模式是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令. 命令模式也就是一个 ...

  4. 【每天一个java设计模式(十四)】 - 解释器模式

    解释器模式提供了评估语言的语法或表达式的方式,它属于行为型模式.这种模式实现了一个表达式接口,该接口解释一个特定的上下文. 解释器模式主要包括以下几个部分: 抽象表达式角色:定义解释器的接口,约定解释 ...

  5. java 生产者消费者_Java多线程:线程间通信—生产者消费者模型

    一.背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步. 另一个问题是, 多个线程之间如何协作呢 ? 我们看一个 ...

  6. java多线程生产者与消费者问题_Java多线程详解之四:生产者消费者问题

    一.问题描述 生产者消费者问题(Producer-Consumer problem),也称有限缓冲区问题(Bounded-buffer promblem),是一个多线程同步问题的经典案例.对于一个固定 ...

  7. java多线程队列_java多线程消费者生产者模式(BlockingQueue 通过阻塞队列实现)

    import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; /** * Cr ...

  8. java 生产者消费者同步_经典线程同步问题(生产者消费者)--Java实现

    原创作品,转载请注明出自xelz's blog 生产者-消费者(producer-consumer)问题是一个著名的线程同步问题.它描述的是:有一群生产者线程在生产产品,并将这些产品提供给消费者线程去 ...

  9. java并发:初探消费者和生产者模式

    消费者和生产者模式 用继承Thread方式,用wait和notifyAll方法实现. 消费者和生产者模式的特点 1. 什么时候生产:仓库没有满的时候,生产者这可以生产,消费者也可以消费,仓库满的时候停 ...

最新文章

  1. QQ、MSN、skype的网页临时会话代码
  2. 将数据库的操作代码从servlet中剥离,封装到DAO中
  3. 常用API-3(System类、Math类、Arrays类、正则表达式)
  4. lmbs PHP,PHP 清空 MySql 指定数据表中的所有数据
  5. 广西高职计算机网络技术,计算机网络技术专业考试大纲-广西职业技术学院.DOC...
  6. Word页眉本来有但不可见 前后相连时
  7. python--单例模式
  8. 计算机界面视频录制软件,视频录制工具怎么用?这样的电脑录屏方法超实用!...
  9. 一剪梅·红藕香残玉簟秋
  10. 理科女生计算机与会计学选择,我是一理科女生、在报考学校时候、选择会计还是会计电算化比较好呢?还有会计与审计、会计于统计核算....
  11. 生育医疗费用出院结算流程
  12. Python内置函数、匿名函数
  13. 计算机网络-CSMA/CD协议
  14. 使用vue2实现打印在线word文件,文件流形式打印在线word,预览打印
  15. jdk、maven、idea安装配置
  16. 2022牛客多校 C Grab the Seat!
  17. 李国庆谈离职:记录一个降薪降职和辞职的观点
  18. linux打通任督二脉百度网盘,2020-07-28-打通多平台发布的任督二脉
  19. 百度适配代码【移动搜索】如何让百度正确识别跳转适配关系
  20. 请求消息详解(请求头、get、post、请求体)

热门文章

  1. 掌握这些核心算法,拿不到10+个offer你来找我,我锤飞你个不争气的
  2. 如何打造一份优秀的技术简历
  3. 台式计算机软件打不开,电脑打开软件显示乱码的解决方法 电脑点击软件没反应怎么办...
  4. 哥德巴赫猜想两种题目解法
  5. 用过印象笔记和石墨文档后,我发现了适合教师的写作软件
  6. Python glob()用法
  7. 申威26010 芯片 服务器,解析申威26010处理器结构(附:国产超算发展史)
  8. 鸽哒im即时通讯源码加教程
  9. android照片涂抹功能,android照片涂画功能实现过程及原理
  10. java web分层和层间数据传递 vo bo po (转载)