- 浏览: 525300 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (161)
- 多线程与并发编程 (20)
- 算法和数据结构 (8)
- 缓存 (0)
- HttpClient (2)
- 疑难杂症 (11)
- Java内存管理 (17)
- 分布式开发 (14)
- Linux常用命令 (10)
- OSGI (0)
- UML (2)
- 趣味面试题 (5)
- 设计模式 (8)
- Java类加载 (2)
- JSTL (1)
- Web 服务器 (4)
- IT人生 (3)
- Java基础 (11)
- Flash技术 (7)
- 新知识 (3)
- 常用速备速查 (4)
- 版本控制 (1)
- Java集合工具类 (6)
- web前端技术 (1)
- 趣味话题 (1)
- 安全 (0)
- 架构设计 (5)
- Spring (4)
- 负载均衡技术 (2)
- 持久层技术 (2)
- MySQL单机多实例方案 (1)
- 收藏备用 (0)
- 性能优化 (3)
最新评论
-
liuwuhen:
...
Pushlet的工作原理 -
fbwfbi:
fengchuizhuming 写道楼主的完全正确。鉴定完毕楼 ...
硬件同步原语(CAS)理论 -
passerby_whu:
uule 写道这个测试后结果为:“testPageConten ...
FutureTask的使用方法和使用实例 -
fengchuizhuming:
楼主的完全正确。鉴定完毕
硬件同步原语(CAS)理论 -
edwardjuice:
FutureTask的使用方法和使用实例
“生产者-消费者-仓储”模型,包含三种角色:
1.生产者
2.消费者
3.仓库
离开了仓储,生产者消费者模型就显得没有说服力了。
对于此模型,应该明确一下几点:
1、生产者仅仅在仓储未满时候生产,仓满则停止生产。
2、消费者仅仅在仓储有产品时候才能消费,仓空则等待。
3、当消费者发现仓储没产品可消费时候会通知生产者生产。
4、生产者在生产出可消费产品时候,应该通知等待的消费者去消费。
下面的三个类分别代表了生产者,消费者和仓库
package producerconsumer;
/**
* <p>Description: Test</p>
* <p>Copyright (c) 2010</p>
* <p>Project:Test</p>
*
* @author Tomy Zhou
* @since 1.0
* @version producerconsumer; Producer.java
* 2010-3-3
**/
public class Producer extends Thread{
Integer producedNumber;
Ware ware;
public Producer(Integer producedNumber, Ware ware){
this.producedNumber = producedNumber;
this.ware = ware;
}
public void run(){
try{
while(true){
ware.put(producedNumber);
}
}catch (Exception e) {
// TODO: handle exception
}
}
}
/**
* <p>Description: Test</p>
* <p>Copyright (c) 2010</p>
* <p>Project:Test</p>
*
* @author Tomy Zhou
* @since 1.0
* @version producerconsumer; Producer.java
* 2010-3-3
**/
public class Producer extends Thread{
Integer producedNumber;
Ware ware;
public Producer(Integer producedNumber, Ware ware){
this.producedNumber = producedNumber;
this.ware = ware;
}
public void run(){
try{
while(true){
ware.put(producedNumber);
}
}catch (Exception e) {
// TODO: handle exception
}
}
}
package producerconsumer;
/**
* <p>Description: Test</p>
* <p>Copyright (c) 2010</p>
* <p>Project:Test</p>
*
* @author Tomy Zhou
* @since 1.0
* @version producerconsumer; Consumer.java
* 2010-3-3
**/
public class Consumer extends Thread{
Integer consumedNumber;
Ware ware;
public Consumer(Integer consumedNumber, Ware ware){
this.consumedNumber = consumedNumber;
this.ware = ware;
}
public void run(){
try{
while(true){
ware.take(consumedNumber);
}
}catch (Exception e) {
// TODO: handle exception
}
}
}
/**
* <p>Description: Test</p>
* <p>Copyright (c) 2010</p>
* <p>Project:Test</p>
*
* @author Tomy Zhou
* @since 1.0
* @version producerconsumer; Consumer.java
* 2010-3-3
**/
public class Consumer extends Thread{
Integer consumedNumber;
Ware ware;
public Consumer(Integer consumedNumber, Ware ware){
this.consumedNumber = consumedNumber;
this.ware = ware;
}
public void run(){
try{
while(true){
ware.take(consumedNumber);
}
}catch (Exception e) {
// TODO: handle exception
}
}
}
package producerconsumer;
/**
* <p>Description: Test</p>
* <p>Copyright (c) 2010</p>
* <p>Project:Test</p>
*
* @author Tomy Zhou
* @since 1.0
* @version producerconsumer; Ware.java
* 2010-3-3
**/
public class Ware {
int capacity;
int size;
public Ware(int capacity){
this.capacity = capacity;
}
public void take(int number) throws InterruptedException{
synchronized (this) {
while(number>size){
System.out.println(Thread.currentThread().getName()+"========The consumer number "+number+" is greater than the size=="+size+".Wait to put.");
this.wait();
}
size = size -number;
System.out.println(Thread.currentThread().getName()+"========Consumer the product========"+number+";The ware has the product======"+size);
this.notifyAll();
}
}
public void put(int number) throws InterruptedException{
synchronized (this) {
while(size+number>capacity){
System.out.println(Thread.currentThread().getName()+"========The put number "+number+" plus the current ware size=="+size +" is greater than capacity=="+capacity+".Wait to consumer.");
this.wait();
}
size = size +number;
System.out.println(Thread.currentThread().getName()+"========Produced the product========"+number+";The ware has the product======"+size);
this.notifyAll();
}
}
public synchronized int size() {
return size;
}
/**
* <p>Description: Test</p>
* <p>Copyright (c) 2010</p>
* <p>Project:Test</p>
*
* @author Tomy Zhou
* @since 1.0
* @version producerconsumer; Ware.java
* 2010-3-3
**/
public class Ware {
int capacity;
int size;
public Ware(int capacity){
this.capacity = capacity;
}
public void take(int number) throws InterruptedException{
synchronized (this) {
while(number>size){
System.out.println(Thread.currentThread().getName()+"========The consumer number "+number+" is greater than the size=="+size+".Wait to put.");
this.wait();
}
size = size -number;
System.out.println(Thread.currentThread().getName()+"========Consumer the product========"+number+";The ware has the product======"+size);
this.notifyAll();
}
}
public void put(int number) throws InterruptedException{
synchronized (this) {
while(size+number>capacity){
System.out.println(Thread.currentThread().getName()+"========The put number "+number+" plus the current ware size=="+size +" is greater than capacity=="+capacity+".Wait to consumer.");
this.wait();
}
size = size +number;
System.out.println(Thread.currentThread().getName()+"========Produced the product========"+number+";The ware has the product======"+size);
this.notifyAll();
}
}
public synchronized int size() {
return size;
}
下面代码大家想想:
synchronized (this) {
while(size+number>capacity){
System.out.println(Thread.currentThread().getName()+"========The put number "+number+" plus the current ware size=="+size +" is greater than capacity=="+capacity+".Wait to consumer.");
this.wait();
}
while(size+number>capacity){
System.out.println(Thread.currentThread().getName()+"========The put number "+number+" plus the current ware size=="+size +" is greater than capacity=="+capacity+".Wait to consumer.");
this.wait();
}
为什么不能改成if (size+number>capacity)?
考虑下面的情况:
capacity:50
current size:40
生产线程Thread-0 put 20+ current size 40 = 60,线程阻塞,并释放锁
生产线程Thread-1 获取监控器的锁,并put10+currnet size 40=50,size=50,唤醒所有阻塞的线程
如果是if:Thread-0往下执行:size=50+20=70,显然超过了仓库的最大库存,在这种情况下就出现问题,如果改成while,Thread 0 仍然会阻塞,不会超过仓库的最大库存。
发表评论
-
死锁实例
2011-05-19 14:21 1938下面这道题,是考死锁的,比较简单,想两个问题: 1.什么时候 ... -
Java存储模型
2011-05-18 13:29 01.什么是存储模型 没有适当的同步,编译器生成指令的次序,可 ... -
设计模式-组合模式
2011-05-16 15:48 1098组合模式的定义: 将对象组合成树的形式来表示整体和局部之 ... -
CompleteService介绍和使用实例
2011-05-11 17:31 3976当向Executor提交批处理任务时,并且希望在它们完成后获得 ... -
CyclicBarrier的使用实例
2011-05-11 15:45 1476CyclicBarrier允许给定数量的线程全部到达关卡点时, ... -
CopyOnWriteArrayList工作原理和实例
2011-05-05 23:43 3380CopyOnWriteArrayList顾名思义,在写入操作时 ... -
Semaphore的介绍和使用实例
2011-04-27 22:32 2807Semaphore可以用来控制能 ... -
FutureTask的使用方法和使用实例
2011-04-27 15:34 13310FutureTask是一种可以取消的异步的计算任务。它的计算是 ... -
CountDownLatch的使用实例
2011-04-26 22:20 8212CountDownLatch CountDownl ... -
Java 并发编程基础-共享对象
2011-04-19 14:48 1444Java 并发编程基础 ... -
从JVM并发看CPU内存指令重排序(Memory Reordering)
2011-04-18 16:17 1479我们都知道,现在的计算机, cpu 在计算的时候 ... -
Java并发编程基础
2011-04-15 14:55 1544Java 并发编程基 ... -
Java多线程基础
2011-04-13 15:52 4733Java 多线程基础 ... 2 ... -
硬件同步原语(CAS)理论
2010-09-24 22:13 6982在Java并发编程中,常常 ... -
java5中使用interrupt()来停止java线程的方法(转)
2010-08-18 23:24 3109在开发java多线程时,如果要停止线程这个问题很头痛吧,不过在 ... -
Java 中的Double Check Lock(转)
2010-07-27 21:13 8090对于多线程编程来说,同步问题是我们需要考虑的最多的问题,同步的 ... -
并发访问的问题解决方案
2010-07-26 18:15 1994目前正在做基于Red 5 的Meeting系统,我们会在Mee ... -
用并发包中的重入锁实现生产消费模型
2010-06-15 00:07 1429传统的生产消费模型,实际上是通过一个条件来调节生产者和消费者线 ... -
ThreadLocal原理(转)
2010-03-24 18:06 2161http://jzhua.iteye.com/blog/517 ... -
(转)Java偏向锁实现原理(Biased Locking)
2010-03-21 22:24 1361http://www.iteye.com/topic/5180 ...
相关推荐
- **主线程**:创建生产者和消费者对象,并将它们分别移动到不同的QThread实例中。然后,使用connect()函数连接生产者的信号到消费者的槽,以实现数据的传递。 5. **同步控制** - **信号量(QSemaphore)**:用于...
`ProducerAndConsumer.zip`中的代码可能包含一个简单的Java实现,生产者类(Producer)和消费者类(Consumer)分别继承自Thread类,它们共享一个`BlockingQueue`实例。生产者类的run方法不断生成数据并调用`queue....
在提供的文件列表中,我们看到多个源代码文件(如producer_consumer_problem.cpp、pc.cpp、pc0.cpp等),这些都是实现生产者消费者模型的不同实例。通过分析这些代码,我们可以学习如何使用C++的多线程库(如std::...
5. **设计模式**:生产者消费者模型可以看作是一种“生产者-消费者”设计模式的实例,它属于行为设计模式,用于协调异步处理和共享资源。此外,还可以结合观察者模式,让消费者订阅生产者,当有新数据时,生产者通知...
四、RocketMQ消费模型实现 1. 广播消费(Broadcasting):每个消费者都会收到所有的消息,适用于所有消费者都需要处理相同消息的场景。 2. 点对点消费(Point-to-Point):每个消息只被一个消费者消费,适用于处理...
在Java多线程编程中,消费者-生产者模型是一种经典的线程间通信模式,用于解决多线程环境下的数据共享问题。该模型涉及到两个主要的角色:生产者(Producer)和消费者(Consumer)。生产者负责创建数据,而消费者则...
生产消费模型是另一种编程概念,常用于多线程环境。在这个模型中,生产者负责创建数据,消费者负责消耗数据。生产者和消费者之间需要协调工作,避免生产过快导致数据堆积,或者消费过快导致无数据可消费。这通常通过...
使用的生产者和消费者模型具有如下特点: (1)本实验的多个缓冲区不是环形循环的,也不要求按顺序访问。生产者可以把产品放到目前某一个空缓冲区中。 (2)消费者只消费指定生产者的产品。 (3)在测试用例文件中指定...
在这个"Kafka大数据 生产者消费者实例"中,我们将探讨如何通过Java编程语言来实现Kafka的生产者和消费者。 首先,我们要理解Kafka中的**生产者(Producer)**,它是负责发布消息到特定主题的组件。在Java中,我们...
操作系统中的生产者与消费者问题是多线程编程中的一个经典模型,它主要研究的是如何有效地在共享资源之间协调生产者和消费者的行为,以避免数据竞争和死锁等问题。在这个C#编写的实例中,我们将深入探讨这个问题及其...
Java多线程生产者消费者模型实例详解 Java多线程生产者消费者模型是指在多线程环境下,生产者线程生产任务,消费者线程消费任务,而缓冲区是生产者和消费者之间的媒介。生产者消费者模型的主要组成部分包括生产者...
Kafka是一个发布/订阅模型的消息队列,它包含生产者(Producer)、消费者(Consumer)和主题(Topic)。生产者负责发布消息到主题,而消费者则订阅这些主题并消费消息。消费者通过消费者组(Consumer Group)进行...
什么是生产者消费者模型 在 工作中,大家可能会碰到这样一种情况:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产 生数据的模块,就形象地称为...
Java中的生产者-消费者模型是一种经典的多线程同步问题,它涉及到线程间的协作与资源管理。在这个模型中,一个线程(生产者)负责生成数据,而另一个线程(消费者)负责处理这些数据。为了实现线程间的同步,Java...
在主函数中,我们创建多个生产者与消费者实例,并启动它们。然后,可以通过监控缓冲区的变化来观察生产者与消费者的行为。 #### 六、实验结果与分析 在完成实验后,我们需要对结果进行详细的分析,包括但不限于: ...
在每次生产或消费后,程序会显示当前的时间、生产者和消费者的生产消费状况,以及缓冲区的使用状况。使用`sleep(1)`函数暂停1秒,以模拟实时的生产消费过程,使得用户可以看到每一步的变化。 整个程序通过控制生产...
一元线性回归模型实例 一元线性回归模型是一种常用的统计模型,用于研究两个连续型变量之间的关系。该模型假设自变量(独立变量)对因变量(dependent variable)的影响,并用数学方程式来描述这种关系。 在本文中...
Kafka的数据模型包括生产者、消费者、主题和分区。 **生产者**是负责生成数据并发送到Kafka集群的应用程序。在Kafka中,生产者可以将消息批量发送到一个或多个主题,以提高效率。生产者通过API与Kafka集群交互,...
在这个“C++ Builder 多线程实例(生产-消费)”中,我们将探讨如何应用多线程技术来模拟生产者和消费者的问题,这是一个经典的并发编程模型。 生产者-消费者问题是一个典型的同步问题,旨在展示如何在共享资源之间...
生产者消费者模式是一种经典的多线程同步模型,用于在并发环境中协调生产者和消费者之间的数据交换。在MFC(Microsoft Foundation Classes)框架下,我们可以利用其丰富的UI支持和线程管理功能来实现这一模式。本...