java同步和互斥的应用:生产者消费者之爸爸妈妈儿子女儿苹果橘子编程实现
来源:互联网 发布:淘宝拍卖海关真的吗 编辑:程序博客网 时间:2024/05/19 23:56
转自:http://blog.csdn.net/chunqiuwei/article/details/7622008
一、转载原文
在《java 同步和互斥程序说明》这篇文章的基础上,来实现下面的程序
桌上有一个空盘子,只允许放一个水果。爸爸可以向盘中放苹果,也可以向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时,一次只能放一只水果。
下面是程序的具体实现代码,在写这个程序的时候,有点小问题,纠结了很长时间,于是在csdn论坛上发表帖子终于得到了解决
先说说涉及到的类的作用,首先Fruits作为一个水果的父类,Apple和Orange是Fruits类的扩展类。CriticalResources类是临界资源类,作为缓冲区用,里面封装了数组大小为一的Fruits数组,可以看成“盘子”;ProducerOrange为生产橘子的类 ProducerApple为生产桔子的类 ConsumerApple(消费苹果的类) ConsumerOrange(消费桔子的类)
水果类代码如下
public class Fruits {private String name;public Fruits(String name) {this.name = name;}@Overridepublic String toString() {return name;}public Fruits() {super();}}
苹果类:
public class Apple extends Fruits {public Apple(String name) {super(name);}public Apple() {// TODO Auto-generated constructor stub}}
桔子类:
public class Orange extends Fruits {public Orange(String name) {super(name);}public Orange() {// TODO Auto-generated constructor stub}}
/** * 生产苹果的生产者 * * @author Arthur * */public class ProducerApple implements Runnable {private CriticalResources cr = null;// 封装一个临界资源对象,以便生产public ProducerApple(CriticalResources cr) {super();this.cr = cr;}private int count = 5;@Overridepublic void run() {while (count-- > 0)synchronized (cr) {while ((cr.peek() != null)) {try {cr.wait();// 缓冲区满,该生产者等待} catch (InterruptedException e) {e.printStackTrace();}}// 如果不加锁,此处容易被打断Fruits fruits = new Apple("苹果");cr.push(fruits);System.out.println("苹果生产商生产了" + fruits);cr.notifyAll();}}}
/** * 消费苹果的消费者 * * @author Arthur * */public class ConsumerApple implements Runnable {private CriticalResources cr = null;// 封装一个临界资源对象,以便消费public ConsumerApple(CriticalResources cr) {super();this.cr = cr;}int count = 5;@Overridepublic void run() { while(count-->0) synchronized (cr) { while (!(cr.peek() instanceof Apple) ) { try { cr.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } Fruits fruits = cr.pop(); System.out.println("----苹果消费者消费了-------" + fruits); cr.notifyAll(); }}}
桔子生产者与消费者代码:
public class ProducerOrange implements Runnable {CriticalResources cr = null;public ProducerOrange(CriticalResources cr) {super();this.cr = cr;}int count = 5; //做5次@Overridepublic void run() { while(count-->0) synchronized (cr) { while (cr.peek() != null) { try { cr.wait();// 该生产这等待 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Fruits fruits = new Orange("橘子"); cr.push(fruits); System.out.println("橘子生产商生产了" + fruits); cr.notifyAll(); }}}
/** * 消费橘子的消费者 * * @author Administrator * */public class ConsumerOrange implements Runnable {private CriticalResources cr = null;// 封装一个临界资源对象,以便消费public ConsumerOrange(CriticalResources cr) {super();this.cr = cr;}int count = 5;@Overridepublic void run() {while (count-- > 0)// 如果缓冲区是苹果synchronized (cr) {while (!(cr.peek() instanceof Orange)) {try {cr.wait();// 该消费者等待} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}Fruits fruits = cr.pop();System.out.println("----橘子消费者消费了-------" + fruits);cr.notifyAll();}}}
public class Client { /** * @param args */ public static void main(String[] args) { CriticalResources cr = new CriticalResources(); // 生产苹果实例 ProducerApple appleP = new ProducerApple(cr); // 消费苹果实例 ConsumerApple appleC = new ConsumerApple(cr); // 橘子生产者实例 ProducerOrange orangeP = new ProducerOrange(cr); // 橘子消费者实例 ConsumerOrange orangeC = new ConsumerOrange(cr); // 生产苹果线程 Thread pThread = new Thread(appleP); // 消费苹果线程 Thread cThread = new Thread(appleC); // 生产橘子线程 Thread pt = new Thread(orangeP); // 消费橘子线程 Thread ct = new Thread(orangeC); pThread.start(); cThread.start(); pt.start(); ct.start(); }}
运行结果
苹果生产商生产了苹果
----苹果消费者消费了-------苹果
橘子生产商生产了橘子
----橘子消费者消费了-------橘子
苹果生产商生产了苹果
----苹果消费者消费了-------苹果
橘子生产商生产了橘子
----橘子消费者消费了-------橘子
苹果生产商生产了苹果
----苹果消费者消费了-------苹果
橘子生产商生产了橘子
----橘子消费者消费了-------橘子
苹果生产商生产了苹果
----苹果消费者消费了-------苹果
橘子生产商生产了橘子
----橘子消费者消费了-------橘子
苹果生产商生产了苹果
----苹果消费者消费了-------苹果
橘子生产商生产了橘子
----橘子消费者消费了-------橘子
================================================================================================================================
二、扩展
- java同步和互斥的应用:生产者消费者之爸爸妈妈儿子女儿苹果橘子编程实现
- 生产者消费者之爸爸妈妈儿子女儿苹果橘子编程实现
- 生产者消费者之爸爸妈妈儿子女儿苹果橘子编程实现
- 在PV操作中会有一个经典的例子就是爸爸妈妈儿子女儿吃水果问题,爸爸妈妈向盘子里放入水果,儿子女儿向盘子取水果。然而爸爸只向盘子放苹果,妈妈只向盘子放橘子,女儿只能吃苹果,儿子只能吃橘子。并且盘子里只能
- 桌子上有一个盘子,每次只能放一个水果.爸爸专门向盘子里放苹果,妈妈专门向盘子里放橘子,一个儿子专门等吃盘子中的橘子,一个女儿专门等吃盘子中的苹果.用信号量实现他们间的同步机制.
- 生产者-消费者问题实现 (linux下C同步信号量和互斥信号量的应用)
- 生产者与消费者之苹果橘子问题
- 父亲 儿子 苹果 女儿 橘子问题
- java同步互斥,生产者消费者
- 多线程模拟-爸爸放橙子给女儿吃,妈妈放苹果给儿子吃
- 用java实现的生产者与消费者多线程同步互斥模型
- Linux互斥与同步应用(三):posix线程实现单个生产者和单个消费者模型
- 妈妈告诉将要出嫁的女儿,爸爸告诉将要结婚的儿子!
- linux同步和互斥综合使用---生产者和消费者
- 三个同步与互斥问题之生产者与消费者
- linux中的生产者和消费者问题--信号量 互斥 同步
- Java实现生产者与消费者的同步
- python 生产者,消费者的同步互斥问题
- expdp network_link参数
- 黑马程序员-android视频播放器
- HttpURLConnection用法详解
- java中double四舍五入并设置小数点位数的问题
- 从NFS启动TQ2440
- java同步和互斥的应用:生产者消费者之爸爸妈妈儿子女儿苹果橘子编程实现
- 第十六周任务一
- Dom获取body元素出现null的问题
- 根据DataRow获取列名
- test
- 浅谈ANR及log分析ANR
- Linux内核的等待队列
- STM32中断中设置的先占式优先级与从优先级(转)
- Lua学习笔记(1)--基本知识介绍