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

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

管程(=“资源管理程序”)将资源和对资源的操作封装起来,资源使用者通过接口操作资源就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. npoi导入导出

    NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作. NPOI是一个开源的Java读写Excel.WORD等微软OLE ...

  2. LINQ学习系列-----2.2 迭代器

    在学习本篇迭代器之前,强烈建议可以先学习一位具有工匠精神博主的文章,链接如下: 农码一生---先说IEnumerable,我们每天用的foreach你真的懂它吗? 本篇文章,是在该博主博文的基础上再次 ...

  3. 安装apache

    1.安装依赖软件 pcre gcc expat apr(Apache portable Run-time libraries,Apache可移植运行库) apr-util [root@localhos ...

  4. Service 之间如何通信?- 每天5分钟玩转 Docker 容器技术(101)

    微服务架构的应用由若干 service 组成.比如有运行 httpd 的 web 前端,有提供缓存的 memcached,有存放数据的 mysql,每一层都是 swarm 的一个 service,每个 ...

  5. Pyhton函数篇(一)之函数中的形参与实参

    1:什么是函数 函数其实就是带名字的代码块,用于完成一些具体的工作.如果我们在写一段程序的时候,需要多次用到同样的一个功能,如果每次都要重复写相同的代码,不仅会增加我们的代码量,更会让我们写出的代码让 ...

  6. 工厂模式(Factory Method)

    1.工厂方法模式(Factory Method) 工厂方法模式分为三种: 1-1.普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 举例如下:(我们举一个发送邮件和短信的例子 ...

  7. 河南省第八届ACM省赛---引水工程

    引水工程 时间限制:2000 ms  |  内存限制:65535 KB 难度: 描述 南水北调工程是优化水资源配置.促进区域协调发展的基础性工程,是新中国成立以来投资额最大.涉及面最广的战略性工程,事 ...

  8. Filebeat轻量级日志采集工具

    Beats 平台集合了多种单一用途数据采集器.这些采集器安装后可用作轻量型代理,从成百上千或成千上万台机器向 Logstash 或 Elasticsearch 发送数据. 一.架构图 此次试验基于前几 ...

  9. 分享一些JAVA相关资源

    前言 以前在学习JAVA时,因为搜索相关资源过于不便,所以在搜集了一些好用的资源之后,将此分享. 文档主要包括面试文档, JAVA的技术文档(如JAVA并发实战.设计模式之类),LINUX的相关文档以 ...

  10. onload和ready的区别

    onload和ready的区别 1.执行时间 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行 $(document).read()是DOM结构绘制完毕后就执行,不必等到加 ...