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. Web前端开发:SQL Jsp小项目(一)

    Jsp的学习算是告一段落,针对这段时间的学习,写了一个Jsp小项目来巩固学到的知识. 框架示意图 User list process UserAdd process 需要的界面效果: 需要工具:Ecl ...

  2. 资源汇集:nginx教程从入门到精通

    http://linux.cn/article-4279-1.html

  3. TabbarItem超炫小动画

    本文转载自 不灭的小灯灯  的博客 Tabbar点击时候超炫小动画 感谢这位大神的分享! 对UITabBarController上TabBar按钮动画详细介绍-->>保证你有意外收获,如有 ...

  4. JavaScript学习笔记(10)——JavaScript语法之操作DOM

    1.页面输出用document.write()方法,但是不可以在window.onload中用,否则整个html页面将被覆盖. 2.通过javascript获取对象后,改变对象中的html内容:doc ...

  5. Smarty模板引擎技术二

    Smarty模板引擎技术 内建函数 include_php内建函数 作用:载入一个php文件,将载入的文件的内容赋值给一个变量   注意:该内建函数只能在2.0中使用,如果使用的话,必须得实例化Sma ...

  6. DTCMS视频模版更改,

    1.去掉style.css中视频的高度 .video-box{ position:relative; width:100%; height:473px; _clear:both; _display:i ...

  7. android系统网络信号强弱参数之ecsq指令参数说明

    ecsq指令参数说明: // For LTE (MT6592) // AT+ECSQ:<sig1>,<sig2>,<rssi_in_qdbm>,<rscp_i ...

  8. RAC环境下SCAN IP可以PING通,1521端口也可以TELNET,但是无法建立数据库连接

    昨天用户请求帮助处理一个问题:有个厂家需要连某个业务系统的数据库,网络上已经开通了权限,SCAN IP可以PING通,测试TELNET 1521端口也是正常.但是想通过SQLPLUS连接,总是会提示连 ...

  9. easyui使用时出现这个Uncaught TypeError: Cannot read property 'combo' of undefined

    easyui使用时出现这个Uncaught TypeError: Cannot read property 'nodeName' of undefined 最后检查发现是必须给select一个id,光 ...

  10. Mac OS X 软件推荐

    ​1. 前言 每个操作系统都有自己的一套软件系统,但是不同的用户却会有不同的需求,系统虽会为用户提供一些基础软件,不过为了能无碍的进入自己的学习和工作状态,总有一些软件是必须安装的,同时这些软件也可以 ...