package test1;
/**
* 该例子演示生产者和消费者的问题(设只有一个缓存空间、一个消费者和一个生产者)
* MySystem类定义了缓冲区个数以及信号量
* @author HYY
*/
public class MySystem {
// 缓存区的个数
private int count = 0; // s1 s2为信号量
private MyInt s1 = new MyInt();// 生产者信号量,初始值为0->表示没有可以存放产品的空间
private MyInt s2 = new MyInt();// 消费者信号量,初始值为0->表示没有可以消费的产品 public int getCount() {
return count;
} public void setCount(int count) {
this.count = count;
} public MyInt getS1() {
return s1;
} public void setS1(MyInt s1) {
this.s1 = s1;
} public MyInt getS2() {
return s2;
} public void setS2(MyInt s2) {
this.s2 = s2;
} // p操作
public synchronized void p(MyInt s) {
s.setI(s.getI() - 1);
if (s.getI() < 0) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} // v操作
public synchronized void v(MyInt s) {
s.setI(s.getI() + 1);
if (s.getI() <= 0) {
this.notify();
}
} public static void main(String[] args) {
System.out.println("生产者-消费者系统初始化,当前信号量都为0,产品数为0.");
MySystem mySystem = new MySystem();
new Thread(new Producer(mySystem)).start();
new Thread(new Consumer(mySystem)).start();
}
} class MyInt {
private int i = 0; public int getI() {
return i;
} public void setI(int i) {
this.i = i;
} } // 生产者
class Producer implements Runnable { private MySystem mySystem; public Producer() {
} public Producer(MySystem mySystem) {
this.mySystem = mySystem;
} @Override
public void run() {
System.out.println("生产者初始化完毕。");
while (true) {
mySystem.setCount(mySystem.getCount() + 1);
System.out.println("生产一个产品,将产品送入缓冲区,当前产品数量:" + mySystem.getCount());
// 设置信号量,通知消费者消费
mySystem.v(mySystem.getS2());
// 设置信号量,检测是否可以继续生产
mySystem.p(mySystem.getS1()); // 休息
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
}
} } // 消费者
class Consumer implements Runnable { private MySystem mySystem; public Consumer() {
} public Consumer(MySystem mySystem) {
this.mySystem = mySystem;
} @Override
public void run() {
System.out.println("消费者初始化完毕。");
while (true) {
// 设置信号量,检测是否允许消费
mySystem.p(mySystem.getS2());
mySystem.setCount(mySystem.getCount() - 1);
System.out.println("消费一个产品,当前产品数量:" + mySystem.getCount() + "。");
// 设置信号量,通知生产者生产
mySystem.v(mySystem.getS1()); // 休息
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
}
}
}

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. SQL通过日期计算年龄

    首先建立一个表如下: ======================= BirthDay datetime not null Age 通过公式计算得出 ======================= 以 ...

  2. 4月8日学习笔记(js基础)

    <script>标签放在<body>和<head> 放在 <head></head> 里的会比放在 <body></bod ...

  3. 5中方式实现String反转

    这里介绍Java中5中实现String反转的方式. 一.数组实现String反转 //数组实现String反转 public String reverseByArray(){ if(str == nu ...

  4. CCM加密学习

    这几天终于搞定了AES硬件加密工具的使用,几种简单的加密模式也都实验通过了,比较麻烦的一种是CCM模式的加密,它是CTR加密模式和CMAC认证算法的混合使用.本文先介绍CCM模式的原理与基本实现,然后 ...

  5. Poj 2707 Copier Reduction

    1.Link: http://poj.org/problem?id=2707 2.Content: Copier Reduction Time Limit: 1000MS   Memory Limit ...

  6. iOS 非ARC基本内存管理系列 -手把手教你ARC——iOS/Mac开发ARC入门和使用(转)

    手把手教你ARC——iOS/Mac开发ARC入门和使用 Revolution of Objective-c 本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流 ...

  7. xamarin android——数据绑定到控件(二)

    本示例为通过媒体内容提供器获取本机中的图片显示在Gallery中. 活动中简单的初始化代码 private void InitGallery() { Gallery gallery = FindVie ...

  8. SMB/CIFS协议解析二

    一.拷贝文件(远程-->本地) 1.SMB_COM_NT_CREATE_ANDX (0xa2)       打开文件,获取文件名,获得读取文件的  总长度. 2.SMB_COM_READ     ...

  9. JavaScript jQuery 入门回顾

    ​$符号 $是著名的jQuery符号.实际上,jQuery把所有功能全部封装在一个全局变量jQuery中,而$也是一个合法的变量名,它是变量jQuery的别名: window.jQuery; // j ...

  10. JS中的!=、== 、!==、===的用法和区别。

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 var num = 1;   var str = '1';   var test = 1;   t ...