java信号量PV操作 解决生产者-消费者问题
2013-09-28 16:49
591 查看
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) { } } } }
相关文章推荐
- JSP/JavaMail实例:邮件发送
- JSP/JavaMail实例:邮件发送
- Java中的String类型
- 初学java者该怎么入门学习?
- java环境变量设置
- Spring mvn eclipse
- java分页工具 pager-taglib
- 重新学习Java——对象和类(二)
- 算法分析中的实现n个数的全排列,使用java语言
- java内存分配
- Java代码查错
- jdk jre jvm的关系
- java 方法和属性在继承中的易错处
- struts配置信息
- Java对象序列化
- java注解
- java 获得的系统时间与操作系统的时间不一致
- java写的未来6天的天气预报
- Javadoc标签介绍
- CXF javax.xml.ws.soap.SOAPFaultException: Fault occurred while processing