多线程中生产者消费者模式是非常重要的模式,如果之前的几个模式都通晓了,这个模式也就水到渠成了。废话少说,下面开始模拟.
模拟功能需要实现如下要求:
1,厨师(MakerThread)会做蛋糕(String)放在桌子(Table)上。
2,桌子太小,顶多可以放3个蛋糕。
3,桌上已经放满3个蛋糕,而厨师还要放上蛋糕的话,会等待到桌子上出现空间为止。
4,客人(EaterThread)会拿桌上的蛋糕吃。
5,桌上没有蛋糕时,客人又要拿蛋糕的话,会等待到蛋糕放到桌子上为止。
涉及的类有:
package ProduceConsumerPattern;
public class Table {
private final String[] buffer;
private int tail;//下一个put的地方
private int head; //下一个take的地方
private int count;//buffer内的蛋糕数
public Table(int count){
this.buffer = new String[count];//生成一个指定容量盛放蛋糕的容器
this.head = 0; //设置下一个放蛋糕的数组索引值
this.tail = 0; //设置下一个拿蛋糕的数组索引值
this.count = 0; //设置容器内含有的蛋糕的数量
}
/*
* 放置蛋糕
*/
public synchronized void put(String cake)throws InterruptedException{
System.out.println(Thread.currentThread().getName() + "puts:" + cake);
while(count >= buffer.length){//如果容器上有大于等于3个蛋糕的话线程进入Table的线程等待区
wait();
}
buffer[tail] = cake;//如果容器里没有满的话,把蛋糕放进容器里
tail = (tail+1) % buffer.length;
count++;//增加蛋糕的数量
notifyAll();
}
//获取蛋糕
public synchronized String take() throws InterruptedException{
while(count<=0){
wait();
}
String cake = buffer[head];
head = (head+1) % buffer.length;
count--;
notifyAll();
System.out.println(Thread.currentThread().getName() + "takes:" + cake);
return cake;
}
}
package ProduceConsumerPattern;
import java.util.Random;
public class MakerThread extends Thread{
private final Random random;
private final Table table;
private static int id = 0;//蛋糕的流水号(每个线程都一样)
public MakerThread(String name,Table table,long seed){
super(name);
this.table = table;
this.random = new Random(seed);
}
public void run(){
try {
while(true){
Thread.sleep(random.nextInt(1000));
String cake = "[Cake No."+ nextId() + "by " + getName();
table.put(cake);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static synchronized int nextId(){
return id++;
}
}
package ProduceConsumerPattern;
import java.util.Random;
public class EaterThread extends Thread{
private final Random random;
private final Table table;
public EaterThread(String name,Table table, long seed){
super(name);
this.table = table;
this.random = new Random(seed);
}
public void run(){
try {
while(true){
String cake = table.take();
Thread.sleep(random.nextInt(1000));
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
package ProduceConsumerPattern;
public class Main {
public static void main(String[] args) {
Table table = new Table(3);
new MakerThread("MakerThread-1",table,31415).start();
new MakerThread("MakerThread-2",table,92653).start();
new MakerThread("MakerThread-3",table,58979).start();
new EaterThread("EaterThread-1",table,32384).start();
new EaterThread("MakerThread-2",table,62643).start();
new EaterThread("EaterThread-3",table,38327).start();
}
}
分享到:
相关推荐
java的多线程示例(生产者消费者问题)
用信号量机制实现多个生产者—消费者问题,实现线程间的同步与互斥
设计一个模拟仿真“生产者-消费者”问题的解决过程及方法的程序。 主要内容是P、V操作过程的设计与实现。生产消费者问题是操作系统设计中经常遇到的问题。多个生产者和消费者线程访问在共享内存中的环形缓冲。生产者...
源代码包括五个类,consumer,producer,product,storage,producerandconsumer
基于队列实现的生产消费者模式java 源码,并且采用多线程进行消费
java中的涉及到生产者 消费者的多线程操作问题
生产者---消费者问题 专 业: 软件工程 年 级: 2010级 小组成员: A B 指导教师: 时 间: 地 点: 2012年 5 月 摘要 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-...
别人的太贵了,自己写一份分享!c语言实现生产者消费者模型,支持设置生产者消费者线程数量,支持设置消息数量。消息的组织形式为链表。生产者生产消息和消费者处理消息分别需要对应的条件变量。代码编译方式见注释
producer_consumer_using_multithreading_in_java 用Java实现的经典生产者消费者问题的多线程解决方案
消费者生产者产品管理系统 这是消费者生产者产品管理系统的简单模型。 它的工作方式类似于Amazon,Flipkart,Myntra等在线购物网站。 请按照以下步骤运行项目:通过执行命令:“ javac Driver.java”,然后在终端中...
生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和...
生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了共享固定大小缓冲区的两个线程——即所谓的“生产者”和...
consumer-producer问题,消费者和生产者问题,多线程
//使生产者写的缓冲区可以被多个消费者使用,实现读写同步; ReleaseSemaphore(h_Semaphore[m_serial],n_Thread,NULL); } //消费者进程 void Consume(void * p) { //局部变量声明; DWORD wait_for_semaphore,m...
流量控制分布式系统项目-针对多生产者和多消费者的多线程服务器T中的缓冲区的流控制开始吧git clone [this_repository_url] 打开Eclipse IDE并添加存储库开始编码用法转到src位置运行服务器java fr / dauphine / sar...
生产者/消费者问题使用(POSIX 信号量和线程) 获取文件: 在实验室计算机上,使用以下命令: git clone git://github.com/cwru-eecs338/example_posix.git 课程: 创建和管理 POSIX 线程和信号量。 从多个 ...
producer_consumer.java 演示生产者-消费者线程 consumer.java 消费者线程 producer.java 生产者线程 common.java 公有类 第9章 示例描述:本章学习运行时类型识别。 Candy.java 一个用来测试的简单类 ...
生产者消费者问题问题陈述: 考虑经典的生产者-消费者问题,其中两个进程共享一个公共的固定大小的缓冲区。 其中一个生产者,将... 编写一个Java程序来解决上述生产者-消费者问题。 由Intelli J提供支持的解决方案。
在Linux环境下,使用多线程和信号量机制实现经典的生产者消费者问题,用信号量机制分别实现生产者线程与消费者线程的同步。 本程序设计了两个进程,一个生产者进程producer模拟生产产品,并把每个产品放到一个空...
生产者-消费者模式下的多线程读/写方案,对应PRODUCERCONSUMER执行模式。 基于Disruptor的生产者-消费者模式下的多线程读/写方案,对于DISRUPTOR执行模式。 程序目录结构 com.daoqidlv.filespilt —— 公共类,及...