在现实应用中,很多时候都需要让多个线程按照一定的次序来访问共享资源,例如,经典的生产者和消费者问题。
仓库中没有产品时,消费者要等待生产者生产产品;当仓库满时,生产者要等待消费者消费产品;在仓库中有产品但
未满时,消费者可以消费产品,生产者可以生产产品。可以采用循环检测的方法来实现,但是可以利用提供的wait(),
notify(),notifyAll()来更好的处理。
共享资源:
/** * 文件:Resoures.java * 描述:TODO * 作者:luckystar2008 * 日期:2012-1-10 */ package thread.product.customer.multiple; /** * @author luckystar2008 * */ public class Resoures { private char[] cArr = new char[5]; //模拟仓库,存放5个字符 private int index = 0; //信号量,初始值为0 public synchronized void push(char c) { if (index == cArr.length) { //仓库已满 try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } cArr[index] = c; index++; notify(); } public synchronized char pop() { if (index == 0) { //仓库是空的,等待生产者生产产品 try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } index--; notify(); return cArr[index]; } }
生产者:
/** * 文件:Productor.java * 描述:模拟生产者 * 作者:luckystar2008 * 日期:2012-1-10 */ package thread.product.customer.multiple; /** * @author luckystar2008 * */ public class Productor extends Thread{ private Resoures r ; public Productor(Resoures r) { this.r = r; } public void run() { for (int i=0;i<5;i++) { char c = (char)(Math.random()*26+'A'); System.out.println("Push element " + c); r.push(c); try { Thread.sleep((long)Math.random()*3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
模拟消费者:
/** * 文件:Consumer.java * 描述:模拟消费者 * 作者:luckystar2008 * 日期:2012-1-10 */ package thread.product.customer.multiple; /** * @author luckystar2008 * */ public class Consumer extends Thread{ private Resoures r; public Consumer(Resoures r) { this.r =r ; } public void run() { for (int i=0;i<5;i++) { char c = r.pop(); System.out.println("Pop element " + c); try { Thread.sleep((long)Math.random()*3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
测试:
/** * 文件:Test.java * 描述:测试 * 作者:luckystar2008 * 日期:2012-1-10 */ package thread.product.customer.multiple; /** * @author luckystar2008 * 生产者和消费者可以同时生产或消费多个产品。 */ public class Test { /** * @param args */ public static void main(String[] args) { Resoures r = new Resoures(); Productor p = new Productor(r); Consumer c = new Consumer(r); c.start(); p.start(); } }
相关推荐
实验目的:使用多线程并发程序设计模拟生产者消费者问题,了解P-V操作的实现方法,实现生产者和消费者的同步和互斥,了解各线程如何使用临界资源和临界区。 主要内容:约束条件:生产者进程负责生产产品放到缓冲区,...
使用多线程程序模拟实现单生产者/多消费者问题。 要求“生产者”随机产生一个整数,“消费者 1”将这个整数加 1 后输出,“消 费者 2”将这个整数加 2 后输出,“消费者 3”将这个整数加 3 后输出,“消 费者 4”将...
Linux C语言 实现利用多进程或多线程模拟实现生产者/消费者问题。 (站在巨人的肩膀上)
.net 多线程 生产者消费者模式 WindForm 窗体 多生产者,多消费者 多线程 加锁 堵塞,注释全面
(Linux C)利用多进程或多线程模拟实现生产者/消费者问题。
NULL 博文链接:https://rd-030.iteye.com/blog/1874400
a: 创建一个线程 ...h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more 生产者消费者问题 (1生产者 2消费者 4缓冲区) problem2 读者与写着问题 I: 信号量 semaphore 解决线程同步问题
C++ 多线程 PV模拟生产者消费者模型多个实例,总结再总结
模拟仿真“生产者-消费者”问题的解决过程及方法。 三、 系统分析与设计 1、 系统分析 在OS中引入进程后,虽然提高了资源的利用率和系统的吞吐量,但由于进程的异步性,也会给系统造成混乱,尤其是在他们争用临界...
内容概要:基于QT Creator环境的多线程编程验证互斥的原理,通过使用semaphore,mutex等控制变量,实现对生产者消费者模型的真实模拟。 适合人群:初学操作系统的学生 能学到什么:调用了Qt多线程类库QThread进行...
使用MFC相关的功能函数来模拟经典进程互斥和同步问题
linux下多线程是想操作系统的经典生产者和消费者模拟实验。用C语言编写,gcc能够编译。而且含有makefile文件的解释。
操作系统实验二:生产者——消费者问题 ...3. 两种环境下,生产者和消费者均作为独立线程,并通过empty、full、mutex三个信号量实现对缓冲进行插入与删除。 4. 通过打印缓冲区中的内容至屏幕,来验证应用程序的正确性。
1、设计目的:通过研究Linux的进程同步机制和信号量,实现生产者消费者问题的并发控制。 2、说明:有界缓冲区内设有20个存储单元,放入取出的产品设定为20个100以内的随机整数。 3、设计要求: 1) 生产者与消费者均...
设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...
本程序主要是利用进程间同步和互斥,模拟实现生产者和消费者在缓冲池的存取过程。 实现过程中,利用数组模拟缓冲池。...也不允许多个生产者或消费者同时放或取,也不允许生产者和消费者同时放和取。
看QT关于生产者消费者的例子挺多,不顾都是命令行程序,不能发挥QT风格。自己做的一个QT的窗口界面模拟生产者消费者的程序,水平不高,子类化QThread,希望对大家有所帮助。
生产消费者问题,用C#控制台编写,希望对大家有用吧~
进程中创建多个线程模拟生产者和消费者,并且满足以下要求:生产者可以把产品放到任意缓冲区中,消费者只消费指定生产者的产品,且为各生产者分配缓冲区时,各生产者必须互斥,各生产者的具体活动并发,而消费者只有...