




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一个生产者一个消费者对应一个缓冲区;源程序:我用的是java语言。import java.lang.Math;public class AProBuffCon /加互斥锁的缓冲区 private int value; /共享变量 private boolean isEmpty=true; /value是否为空的信号量 public synchronized void put(int i) /同步方法 while (!isEmpty) /当value不空时,等待 try this.wait(); /使调用该方法的当前线程等待,即阻塞自己 catch(InterruptedException e) value = i; /当value空时,value获得值 System.out.println(Thread.currentThread().getName()+ Producer put : +value); isEmpty = false; /设置value为不空状态 notifyAll(); /唤醒其他所有等待线程 public synchronized int get() /同步方法 while (isEmpty) /当value空时,等待 try this.wait(); catch(InterruptedException e) isEmpty = true; /设置value为空状态,并返回值 notifyAll(); /唤醒其他所有等待线程 return value; public static void main (String args) AProBuffCon buffer = new AProBuffCon(); (new Producered(buffer).start(); /构造两个生产者线程和两个消费者线程 (new Consumered(buffer).start(); class Producered extends Thread /生产者 private AProBuffCon buffer; public Producered(AProBuffCon buffer) this.buffer = buffer; public void run( ) / for (int i=1; i=10; i+) / int j=(int)(Math.random()*10); buffer.put(j); / class Consumered extends Thread /消费者 private AProBuffCon buffer; public Consumered(AProBuffCon buffer) this.buffer = buffer ; public void run() / for (int i=1; i=10; i+) /消费者从缓冲区中取数 System.out.println(tttt+Thread.currentThread().getName()+ Consumer get : +buffer.get(); 说明: 都是先生产在消费。多个生产者多个消费者对应一个缓冲区源程序:import java.lang.Math;public class AProBuffCon /加互斥锁的缓冲区 private int value; /共享变量 private boolean isEmpty=true; /value是否为空的信号量 public synchronized void put(int i) /同步方法,synchronized保证一段时间内只有一个对象访问这段程序 while (!isEmpty) /当value不空时,等待 try this.wait(); /使调用该方法的当前线程等待,即阻塞自己 catch(InterruptedException e) value = i; /当value空时,value获得值 System.out.println(Thread.currentThread().getName()+ 生产了 : +value); isEmpty = false; /设置value为不空状态 notifyAll(); /唤醒其他所有等待线程 public synchronized void get() /同步方法,这个成为了事实上的消费者,因为如果在外部消费,信号量不好传递 while (isEmpty) /当value空时,等待 try this.wait(); catch(InterruptedException e) isEmpty = true; /设置value为空状态,并返回值 System.out.println(tttt+Thread.currentThread().getName()+消费了 +value); notifyAll(); /唤醒其他所有等待线程 public static void main (String args) AProBuffCon buffer = new AProBuffCon(); (new Producered(buffer).start(); (new Consumered(buffer).start(); (new Producered(buffer).start(); (new Consumered(buffer).start(); (new Producered(buffer).start(); (new Consumered(buffer).start(); (new Producered(buffer).start(); (new Consumered(buffer).start(); class Producered extends Thread /生产者 private AProBuffCon buffer; public Producered(AProBuffCon buffer) this.buffer = buffer; public void run( ) int j=(int)(Math.random()*10); buffer.put(j); class Consumered extends Thread /消费者 private AProBuffCon buffer; public Consumered(AProBuffCon buffer) this.buffer = buffer ; public void run() buffer.get(); 一个消费者一个生产者一个缓冲池源程序及注释import java.lang.Math;public class AProBuffCon /加互斥锁的缓冲区 private int value=new int10; /共享缓冲池 private int in=0; /设置开关锁in标志向缓冲池生产数据,out标志消费缓冲池的数据 private int out=0; public synchronized void put(int i) /同步方法,实际上向缓冲池生产数据,synchronized保证一段时间内只有一个对象访问这段程序 while (in+1)%10=out) /当缓冲池满时,等待 try this.wait(); /使调用该方法的当前线程等待,即阻塞自己 catch(InterruptedException e) /try catch语句,没什么意义 valuein = i; /当缓冲池不满时,可以生产数据 System.out.println(Thread.currentThread().getName()+在+in+号缓冲区+生产了 : +valuein); in=(in+1)%10; /生产好数据后,in向后移动一位 notifyAll(); /唤醒其他所有等待线程 public synchronized void get() /同步方法,这个成为了事实上的消费者,因为如果在外部消费,信号量不好传递 while (in=out) /缓冲池为空时,等待 try this.wait(); catch(InterruptedException e) System.out.println(tttt+Thread.currentThread().getName()+消费了+out+号缓冲区数据:+valueout); out=(out+1)%10; /消费完数据,out后移一位 notifyAll(); /唤醒其他所有等待线程 public static void main (String args) /主方法,产生一个消费者,一个生产者 AProBuffCon buffer = new AProBuffCon(); (new Producered(buffer).start(); /start()方法标志线程活过来了 (new Consumered(buffer).start(); class Producered extends Thread /名义上的生产者线程 private AProBuffCon buffer; public Producered(AProBuffCon buffer) this.buffer = buffer; public void run( ) for(int i=1;i=20;i+) int j=(int)(Math.random()*10); buffer.put(j); class Consumered extends Thread /消费者 private AProBuffCon buffer; public Consumered(AProBuffCon buffer) this.buffer = buffer ; public void run() for(int i=1;i=20;i+) buffer.get(); 多个生产者多个消费者一个缓冲池源程序:import java.lang.Math;public class AProBuffCon /加互斥锁的缓冲区 private int value=new int10; /共享缓冲池 private int in=0; /设置开关锁in标志向缓冲池生产数据,out标志消费缓冲池的数据 private int out=0; public synchronized void put(int i) /同步方法,实际上向缓冲池生产数据,synchronized保证一段时间内只有一个对象访问这段程序 while (in+1)%10=out) /当缓冲池满时,等待 try this.wait(); /使调用该方法的当前线程等待,即阻塞自己 catch(InterruptedException e) /try catch语句,没什么意义 valuein = i; /当缓冲池不满时,可以生产数据 System.out.println(Thread.currentThread().getName()+在+in+号缓冲区+生产了 : +valuein); in=(in+1)%10; /生产好数据后,in向后移动一位 notifyAll(); /唤醒其他所有等待线程 public synchronized void get() /同步方法,这个成为了事实上的消费者,因为如果在外部消费,信号量不好传递 while (in=out) /缓冲池为空时,等待 try this.wait(); catch(InterruptedException e) System.out.println(tttt+Thread.currentThread().getName()+消费了+out+号缓冲区数据:+valueout); out=(out+1)%10; /消费完数据,out后移一位 notifyAll(); /唤醒其他所有等待线程 public static void main (String args) /主方法,产生一个消费者,一个生产者 AProBuffCon buffer = new AProBuffCon(); (new Producered(buffer).start(); /start()方法标志线程活过来了 (new Consumered(buffer).start(); (new Producered(buffer).start(); /start()方法标志线程活过来了 (new Consumered(buffer).start(); (new Producered(buffer).start(); /start()方法标志线程活过来了 (new Consumered(buffer).start(); class Producered extends Thread /名义上的生产者线程 private AProBuffCon buffer; public Producered(AProBuffCon buffer) this.buffer = buffer; public void run( ) for(int i=1;i=11;i+) int j=(int)(Math.random()*10); buffer.put(j); class Consumered extends Thread /消费者 private AProBuffCon buffer; public Consumered(AProBuffCon buffer) this.buffer = buffer ; public void run() for(int i=1;i=11;i+) buffer.get(); 为什么wait()和signal()一定得是原语?wait()与signal()一定是原语,不能分开分析:假设有下面一个关系: S1 a a S2 S3前提:我们把S1当成是生产者,S2和S3为竞争的消费者,正常情况下,他们两个只能有一个来对S1生产的数据进行消费
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人教六年级下册期末数学模拟真题题目经典套题答案
- 南阳市部编版四年级语文阅读理解解题技巧专题练习(附答案)
- 备战中考化学与酸和碱的中和反应有关的压轴题附详细答案
- 运城市语文五年级下册期末复习试题
- 【语文】北京市半步桥小学四年级下册期末复习试题(含答案)
- 泉州市七年级上学期期中地理试题及答案
- 2025年全国焊工操作证理论考试题库含答案
- 2025年建筑安全资质考试题库含答案
- 消毒员考试题库及答案
- 安全生产与职业健康目标管理制度
- 新教科版小学1-6年级科学需做实验目录
- 读懂诗家语省公开课金奖全国赛课一等奖微课获奖课件
- 24春国家开放大学《农业推广》调查报告参考答案
- 山西省职校技能大赛(植物病虫害防治赛项)参考试题库(含答案)
- 安全生产培训内容
- 酒店设施维护与管理的重要性与实践:延长设备使用寿命降低维修成本
- 老年人认知障碍的早期识别与干预
- 新人教版版PEP小学英语(3-6年级)单词表(带音标)
- 小兵张嘎夺枪记(课本剧)
- 《电子商务法律法规》课程标准
- 医院关于印发《即时检验临床应用管理办法》的通知
评论
0/150
提交评论