同样是实验存档。//。。

依然以生产者消费者问题作为背景。

管程(=“资源管理程序”)将资源和对资源的操作封装起来,资源使用者通过接口操作资源就ok,不用去考虑进程同步的问题。

管程:

  1. package entity.producerconsumer;
  2.  
  3. public class Monition {
  4. private Buffer buffer;
  5.  
  6. public Monition(int bufferSize) {
  7. buffer = new Buffer(bufferSize);
  8. }
  9.  
  10. /**
  11. * 如果放入产品成功返回 true
  12. * @return
  13. */
  14. public synchronized boolean put() {
  15. if (buffer.notFull()) {
  16. buffer.putItem();
  17. return true;
  18. }
  19. return false;
  20. }
  21.  
  22. /**
  23. * 如果取出产品成功返回 true
  24. * @return
  25. */
  26. public synchronized boolean get() {
  27. if (buffer.notEmpty()) {
  28. buffer.getItem();
  29. return true;
  30. }
  31. return false;
  32. }
  33.  
  34. public String getStatus() {
  35. return "" + buffer;
  36. }
  37. }

生产者 & 消费者:

  1. package entity.producerconsumer;
  2.  
  3. public class Produc implements Runnable {
  4. /**
  5. * 统计生产者数量
  6. */
  7. private static int total = 0;
  8. /**
  9. * 生产者个体的 id
  10. */
  11. private int id;
  12.  
  13. private Monition PC;
  14.  
  15. public Produc(Monition monition) {
  16. id = ++total;
  17. PC = monition;
  18. }
  19.  
  20. @Override
  21. public void run() {
  22. while (true) {
  23. if (PC.put()) {
  24. // 如果操作成功打印缓冲区状态
  25. System.out.println(id + " 号生产者: " + PC.getStatus());
  26. }
  27. }
  28. }
  29. }

/

  1. package entity.producerconsumer;
  2.  
  3. public class Consu implements Runnable {
  4. /**
  5. * 统计消费者数量
  6. */
  7. private static int total = 0;
  8. /**
  9. * 消费者个体的 id
  10. */
  11. private int id;
  12.  
  13. private Monition PC;
  14.  
  15. public Consu(Monition monition) {
  16. id = ++total;
  17. PC = monition;
  18. }
  19.  
  20. @Override
  21. public void run() {
  22. while (true) {
  23. if (PC.get()) {
  24. // 如果操作成功打印缓冲区状态
  25. System.out.println(id + " 号消费者: " + PC.getStatus());
  26. }
  27. }
  28. }
  29. }

/

Buffer.java

测试:

  1. package test;
  2.  
  3. import entity.producerconsumer.Consu;
  4. import entity.producerconsumer.Monition;
  5. import entity.producerconsumer.Produc;
  6.  
  7. public class MonitionTest {
  8. public static void main(String[] args) {
  9. Monition PC = new Monition(10);
  10. // 创建 5 个生产者和 5 个消费者
  11. for (int i = 0; i != 5; ++i) {
  12. new Thread(new Produc(PC)).start();
  13. new Thread(new Consu(PC)).start();
  14. }
  15. }
  16. }

Java 管程解决生产者消费者问题的更多相关文章

  1. Java管程解决生产者消费者问题

    同样是实验存档.//.. 依然以生产者消费者问题作为背景. 管程(=“资源管理程序”)将资源和对资源的操作封装起来,资源使用者通过接口操作资源就ok,不用去考虑进程同步的问题. 管程: package ...

  2. java多线程解决生产者消费者问题

    import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class ...

  3. Java如何使用线程解决生产者消费者问题?

    在Java编程中,如何使用线程解决生产者消费者问题? 以下示例演示如何使用线程解决生产者消费者问题. package com.yiibai; public class ProducerConsumer ...

  4. 使用Java的BlockingQueue实现生产者-消费者

    http://tonl.iteye.com/blog/1936391 使用Java的BlockingQueue实现生产者-消费者 博客分类: Java JavaBlockingQueue阻塞队列  B ...

  5. Linux多线程实践(六)使用Posix条件变量解决生产者消费者问题

    前面的一片文章我们已经讲过使用信号量解决生产者消费者问题.那么什么情况下我们须要引入条件变量呢? 这里借用  http://www.cnblogs.com/ngnetboy/p/3521547.htm ...

  6. 基于java callable及future接口解决生产者消费者问题

    这两天复习java线程时,把java里面的线程基本知识点与jdk1.5以后新添加的一些类的使用都了解了一下,借用生产者消费者的问题来将他们实践一下. 题目:(题目在csdn一大牛的空间找的) 生产者- ...

  7. java使用synchronized与Semaphore解决生产者消费者问题对比

    一.synchronized与信号量Semaphore简介 1.synchronized是java中的关键字,是用来控制线程同步的问题最常用的方法. 2.Semaphore是属于java的一个类,同样 ...

  8. java信号量PV操作 解决生产者-消费者问题

    package test1; /** * 该例子演示生产者和消费者的问题(设只有一个缓存空间.一个消费者和一个生产者) * MySystem类定义了缓冲区个数以及信号量 * @author HYY * ...

  9. JAVA多线程经典问题 -- 生产者 消费者

    工作2年多来一直也没有计划写自己的技术博客,最近辞职在家翻看<thingking in JAVA>,偶尔看到了生产者与消费者的一个经典的多线程同步问题.本人在工作中很少使用到多线程以及高并 ...

随机推荐

  1. 【原创】抓个Firefox的小辫子,围观群众有:Chrome、Edge、IE8-11

    前言 很多人都知道我们在做FineUI控件库,在这 9 年多的时间里,在和浏览器无数次的交往中,也发现了多个浏览器自身的BUG,并公开出来方便大家查阅: 分享IE7一个神奇的BUG(不是封闭标签的问题 ...

  2. 3255:十进制到六进制-poj

    3255:十进制到六进制 总时间限制:  1000ms 内存限制:  65536kB 描述 进制转换: 将十进制(不超过int类型表示的范围)的数转换为六进制的数. 输入 输入为第一行是组数n,后面n ...

  3. CCF-201604-1-折点计数

    问题描述 试题编号: 201604-1 试题名称: 折点计数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定n个整数表示一个商店连续n天的销售量.如果某天之前销售量在增长 ...

  4. KD-tree详解

    转载自:http://blog.csdn.NET/zhjchengfeng5/article/details/7855241 首先来一个问题: 给定平面上一个点集 E ,还有一个定点 V ,怎么在一群 ...

  5. CDH集群搭建部署

    1. 硬件准备     使用了五台机器,其中两台8c16g,三台4c8g.一台4c8g用于搭建cmServer和NFS服务端,另外4台作为cloudera-manager agent部署CDH集群. ...

  6. java 事件处理

    Java事件处理机制:EventObject类作为描述事件信息的事件信息类的基类,由EventListener接口派生新的接口或类来作为事件接收方的类,再定义事件源类. 事件信息类的构造方法必须含有事 ...

  7. 自学Python全栈开发的第二次笔记(Python需要注意的地方)

    好几天没写blog了,今天整理整理.写blog一定要坚持下去.     Python解释器 #!/usr/bin/env python #-*-coding:utf-8-*-   #  无效的内容,只 ...

  8. Java设计模式之职责链设计模式

    1.什么是-职责链设计模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求 ...

  9. 基于 Vue.js 的移动端组件库mint-ui实现无限滚动加载更多

    通过多次爬坑,发现了这些监听滚动来加载更多的组件的共同点, 因为这些加载更多的方法是绑定在需要加载更多的内容的元素上的, 所以是进入页面则直接触发一次,当监听到滚动事件之后,继续加载更多, 所以对于无 ...

  10. EGOCache缓存框架具体解说

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...