操作系统生产者消费者缓冲池与区的问题.doc_第1页
操作系统生产者消费者缓冲池与区的问题.doc_第2页
操作系统生产者消费者缓冲池与区的问题.doc_第3页
操作系统生产者消费者缓冲池与区的问题.doc_第4页
操作系统生产者消费者缓冲池与区的问题.doc_第5页
已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论