1. package test1;
  2. /**
  3. * 该例子演示生产者和消费者的问题(设只有一个缓存空间、一个消费者和一个生产者)
  4. * MySystem类定义了缓冲区个数以及信号量
  5. * @author HYY
  6. */
  7. public class MySystem {
  8. // 缓存区的个数
  9. private int count = 0;
  10.  
  11. // s1 s2为信号量
  12. private MyInt s1 = new MyInt();// 生产者信号量,初始值为0->表示没有可以存放产品的空间
  13. private MyInt s2 = new MyInt();// 消费者信号量,初始值为0->表示没有可以消费的产品
  14.  
  15. public int getCount() {
  16. return count;
  17. }
  18.  
  19. public void setCount(int count) {
  20. this.count = count;
  21. }
  22.  
  23. public MyInt getS1() {
  24. return s1;
  25. }
  26.  
  27. public void setS1(MyInt s1) {
  28. this.s1 = s1;
  29. }
  30.  
  31. public MyInt getS2() {
  32. return s2;
  33. }
  34.  
  35. public void setS2(MyInt s2) {
  36. this.s2 = s2;
  37. }
  38.  
  39. // p操作
  40. public synchronized void p(MyInt s) {
  41. s.setI(s.getI() - 1);
  42. if (s.getI() < 0) {
  43. try {
  44. this.wait();
  45. } catch (InterruptedException e) {
  46. e.printStackTrace();
  47. }
  48. }
  49. }
  50.  
  51. // v操作
  52. public synchronized void v(MyInt s) {
  53. s.setI(s.getI() + 1);
  54. if (s.getI() <= 0) {
  55. this.notify();
  56. }
  57. }
  58.  
  59. public static void main(String[] args) {
  60. System.out.println("生产者-消费者系统初始化,当前信号量都为0,产品数为0.");
  61. MySystem mySystem = new MySystem();
  62. new Thread(new Producer(mySystem)).start();
  63. new Thread(new Consumer(mySystem)).start();
  64. }
  65. }
  66.  
  67. class MyInt {
  68. private int i = 0;
  69.  
  70. public int getI() {
  71. return i;
  72. }
  73.  
  74. public void setI(int i) {
  75. this.i = i;
  76. }
  77.  
  78. }
  79.  
  80. // 生产者
  81. class Producer implements Runnable {
  82.  
  83. private MySystem mySystem;
  84.  
  85. public Producer() {
  86. }
  87.  
  88. public Producer(MySystem mySystem) {
  89. this.mySystem = mySystem;
  90. }
  91.  
  92. @Override
  93. public void run() {
  94. System.out.println("生产者初始化完毕。");
  95. while (true) {
  96. mySystem.setCount(mySystem.getCount() + 1);
  97. System.out.println("生产一个产品,将产品送入缓冲区,当前产品数量:" + mySystem.getCount());
  98. // 设置信号量,通知消费者消费
  99. mySystem.v(mySystem.getS2());
  100. // 设置信号量,检测是否可以继续生产
  101. mySystem.p(mySystem.getS1());
  102.  
  103. // 休息
  104. try {
  105. Thread.sleep(500);
  106. } catch (InterruptedException e) {
  107. }
  108. }
  109. }
  110.  
  111. }
  112.  
  113. // 消费者
  114. class Consumer implements Runnable {
  115.  
  116. private MySystem mySystem;
  117.  
  118. public Consumer() {
  119. }
  120.  
  121. public Consumer(MySystem mySystem) {
  122. this.mySystem = mySystem;
  123. }
  124.  
  125. @Override
  126. public void run() {
  127. System.out.println("消费者初始化完毕。");
  128. while (true) {
  129. // 设置信号量,检测是否允许消费
  130. mySystem.p(mySystem.getS2());
  131. mySystem.setCount(mySystem.getCount() - 1);
  132. System.out.println("消费一个产品,当前产品数量:" + mySystem.getCount() + "。");
  133. // 设置信号量,通知生产者生产
  134. mySystem.v(mySystem.getS1());
  135.  
  136. // 休息
  137. try {
  138. Thread.sleep(500);
  139. } catch (InterruptedException e) {
  140. }
  141. }
  142. }
  143. }

java信号量PV操作 解决生产者-消费者问题的更多相关文章

  1. 操作系统实验——PV操作实现生产者消费者模型

    操作系统PV操作之--生产者消费者模型 个人博客主页 参考资料: Java实现PV操作 | 生产者与消费者 浙大公开课 在操作系统的多进程.多线程操作中经常会有因为同步.互斥等等问题引发出的一系列问题 ...

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

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

  3. Java实现PV操作 | 生产者与消费者

    导语 在学习操作系统的过程中,PV操作是很重要的一个环节.然而面对书本上枯燥的代码,每一个爱好技术的人总是想能亲自去实现.现在我要推出一个专题,专门讲述如何用Java实现PV操作,让操作系统背后的逻辑 ...

  4. Linux多线程实践(5) --Posix信号量与互斥量解决生产者消费者问题

    Posix信号量 Posix 信号量 有名信号量 无名信号量 sem_open sem_init sem_close sem_destroy sem_unlink sem_wait sem_post ...

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

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

  6. Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例

    Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例 本文由 TonySpark 翻译自 Javarevisited.转载请参见文章末尾的要求. Java.util.concurr ...

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

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

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

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

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

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

随机推荐

  1. 交叉编译lsof for android

    Android 自带的那个 lsof 实际上是 toolbox 里的,功能十分单一,除了显示出所有进程的所有打开的文件外就什么都不能做,连说明也没有 :-( 于是为了 htop 用着爽一点,还是自己编 ...

  2. 委托[delegate]_C#

    委托(delegate): 委托声明定义了一种类型,它用一组特定的参数以及返回类型来封装方法.对于静态方法,委托对象封装要调用的方法.对于实例方法,委托对象同时封装一个实例和该实例上的一个方法.如果您 ...

  3. jquery的map()和each()方法

    1. map()方法 //找到所有的标题元素,映射它们的ID,并转化为数组后排序 $(':header').map(function(){return this.id}).toArray().sort ...

  4. Redirect and POST in ASP.NET

    http://www.codeproject.com/Articles/37539/Redirect-and-POST-in-ASP-NET

  5. alter和alert的一些问题

    今天在Java学习群里看到有人问:用alert能不能修改表结构?我第一反应是,alert是弹窗啊,怎么修改表结构?后来再看才知道,是那人打错了!我也晕了一下,还是记一下吧!alter是修改表结构的,a ...

  6. c# 海康威视 Winform播放mp4视频

    最近有个视频播放系统,需要对海康的mp4格式视频进行播放,由于普通播放器无法对该视频进行播放原因是海康对视频进行了自己的编码,需要相应的解码才可以对视频进行播放. 下面是对海康威视视频播放的c#代码( ...

  7. input属性disabled和readonly的区别

    两种属性的写法如下: 1.<input type="text" name="name" value="xxx" disabled=&q ...

  8. PHP连接局域网MYSQL数据库的简单实例

    PHP连接局域网MYSQL数据库的简单实例 [php] view plaincopy <?PHP /** * php连接mysql数据库 * by www.jbxue.com */ $conn= ...

  9. Spark Streaming揭秘 Day5 初步贯通源码

    Spark Streaming揭秘 Day5 初步贯通源码 引子 今天,让我们从Spark Streaming最重要的三个环节出发,让我们通过走读,逐步贯通源码,还记得Day1提到的三个谜团么,让我们 ...

  10. Microsoft Visual Studio Ultimate 2013 旗舰版 有效注册密钥

    Visual Studio Ultimate 2013 KEY(密钥):BWG7X-J98B3-W34RT-33B3R-JVYW9 Visual Studio Premium 2013 KEY(密钥) ...