- 浏览: 1185690 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (350)
- Ajax研究 (2)
- javascript (22)
- struts (15)
- hibernate (12)
- spring (8)
- 我的生活 (28)
- jsp (2)
- 我的随笔 (84)
- 脑筋急转弯 (1)
- struts2 (2)
- ibatis (1)
- groovy (1)
- json (4)
- flex (20)
- Html Css (5)
- lucene (11)
- solr研究 (2)
- nutch (25)
- ExtJs (3)
- linux (6)
- 正则表达式 (2)
- xml (1)
- jetty (0)
- 多线程 (1)
- hadoop (40)
- mapreduce (5)
- webservice (2)
- 云计算 (8)
- 创业计划 (1)
- android (8)
- jvm内存研究 (1)
- 新闻 (2)
- JPA (1)
- 搜索技术研究 (2)
- perl (1)
- awk (1)
- hive (7)
- jvm (1)
最新评论
-
pandaball:
支持一下,心如大海
做有气质的男人 -
recall992:
山东分公司的风格[color=brown]岁的法国电视[/co ...
solr是如何存储索引的 -
zhangsasa:
-services "services-config ...
flex中endpoint的作用是什么? -
来利强:
非常感谢
java使用json所需要的几个包 -
zhanglian520:
有参考价值。
hadoop部署错误之一:java.lang.IllegalArgumentException: Wrong FS
java多线程一般都会讲消费者-生产者模型
生产者与消费者模型中,要保证以下几点:
1 同一时间内只能有一个生产者生产
2 同一时间内只能有一个消费者消费
3 生产者生产的同时消费者不能消费
4 消息队列满时生产者不能继续生产
5 消息队列空时消费者不能继续消费
参考了下网上一个代码实例http://www.talented.com.cn/archives/2007/5/16_141.html 发现作者写得有问题 修改了一些代码 现在ok了
----------------------------------------------------Message类
package com.example.test;
public class Message {
public static int id;
public String content;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public int getId() {
return id;
}
public void setId(int id) {
Message.id = id;
}
}
----------------------------------------------------Queue类
package com.example.test;
import java.util.ArrayList;
import java.util.List;
public class Queue {
List<Message> queue = new ArrayList<Message>();
/** 队列中message对象的最大值,默认为5 */
int maxMessageNum = 5;
public synchronized void produce(Message message) {
this.notifyAll();
while (queue.size() == maxMessageNum) {
System.out.println(Thread.currentThread().getName()
+ " 队列满!等待中。。。");
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
queue.add(message);
System.out.println(Thread.currentThread().getName() + "正在生产"
+ message.getContent() + "。。。 ,当前个数:" + getCount());
}
public synchronized void consume() {
this.notifyAll();
while (queue.size() == 0) {
System.out.println(Thread.currentThread().getName()
+ " 队列空!等待中。。。");
try {
System.out.println("begin!");
wait();
System.out.println("end!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Message message = queue.get(0);
queue.remove(0);
System.out.println(Thread.currentThread().getName() + "正在消费"
+ message.getContent() + "。。。 ,当前个数: " + getCount());
}
public synchronized int getCount() {
return queue.size();
}
}
----------------------------------------------------Test类
package com.example.test;
public class Test {
public static void main(String[] args) {
Queue Q = new Queue();
Producer wQ1 = new Producer(Q);
Producer wQ2 = new Producer(Q);
Consumer rQ1 = new Consumer(Q);
Consumer rQ2 = new Consumer(Q);
Consumer rQ3 = new Consumer(Q);
Thread threadWQ1 = new Thread(wQ1, "thread-wQ1");
Thread threadWQ2 = new Thread(wQ2, "thread-wQ2");
Thread threadRQ1 = new Thread(rQ1, "thread-rQ1");
Thread threadRQ2 = new Thread(rQ2, "thread-rQ2");
Thread threadRQ3 = new Thread(rQ3, "thread-rQ3");
threadWQ1.start();
threadWQ2.start();
threadRQ1.start();
threadRQ2.start();
threadRQ3.start();
}
}
class Producer extends Thread {
private Queue queue;
Producer(Queue queue) {
this.queue = queue;
}
public void run() {
while (true) {
Message message = new Message();
message.setId(++Message.id);
message.setContent("food"+Message.id);
queue.produce(message);
try {
sleep(100);
} catch (Exception e) {
}
}
}
}
class Consumer extends Thread {
private Queue queue;
Consumer(Queue queue) {
this.queue = queue;
}
public void run() {
while (true) {
queue.consume();
try {
sleep(100);
} catch (Exception e) {
}
}
}
}
评论
生产者和消费者(BolockingQueue Implements)
http://compous-cn.iteye.com/blog/625888
该方法锁定的资源是“message”还是“queue”?
锁定的是这个produce方法
这个应该是锁定的是Queue对象吧,要执行produce方法,必须要拿到Queue对象的锁。
锁对象,有人还没有搞清楚同步的对象是哪个哦!
锁定"queue",会不会将message也附带锁上呢,毕竟message存放在queue里面?
该方法锁定的资源是“message”还是“queue”?
锁定的是这个produce方法
锁对象的,锁方法的话,java的同步就没意义了.
该方法锁定的资源是“message”还是“queue”?
锁定的是这个produce方法
这个应该是锁定的是Queue对象吧,要执行produce方法,必须要拿到Queue对象的锁。
锁对象,有人还没有搞清楚同步的对象是哪个哦!
该方法锁定的资源是“message”还是“queue”?
锁定的是这个produce方法
这个应该是锁定的是Queue对象吧,要执行produce方法,必须要拿到Queue对象的锁。
该方法锁定的资源是“message”还是“queue”?
锁定的是这个produce方法
import java.util.ArrayList;
import java.util.List;
public class ProductQueue {
private List<Product> products;
private int maxSize;
public ProductQueue(int maxSize){
this.maxSize = maxSize;
products = new ArrayList<Product>(maxSize);
}
public synchronized void addProdcut(Product product){
while(isFull()){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
products.add(product);
System.out.println("Produce:" + product.getId() + " " + product.getMadeDate());
notifyAll();
}
public synchronized void removeProduct(){
while(isEmpty()){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Product product = products.get(products.size() - 1);
products.remove(product);
System.out.println("Consume:" + product.getId() + " " + product.getMadeDate());
notifyAll();
}
public synchronized boolean isFull(){
boolean isFull = products.size() == maxSize;
if(isFull){
System.out.println("The queue is full.");
}
return isFull;
}
public synchronized boolean isEmpty(){
boolean isEmpty = products.size() <= 0;
if(isEmpty){
System.out.println("The queue is empty.");
}
return isEmpty;
}
}
public class Consumer implements Runnable{
private ProductQueue queue;
public Consumer(ProductQueue queue){
this.queue = queue;
}
@Override
public void run() {
while(true){
queue.removeProduct();
try {
Thread.sleep(100l);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
import java.util.Date;
public class Producer implements Runnable{
private static int id;
private ProductQueue queue;
public Producer(ProductQueue queue){
this.queue = queue;
}
@Override
public void run() {
while(true){
Product product = new Product(id++,new Date());
queue.addProdcut(product);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
import java.util.Date;
public class Product {
private int id;
private Date madeDate;
public Product(int id, Date madeDate){
this.id = id;
this.madeDate = madeDate;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Date getMadeDate() {
return madeDate;
}
public void setMadeDate(Date madeDate) {
this.madeDate = madeDate;
}
}
public class ThreadMain {
public static void main(String[] args) {
ProductQueue queue = new ProductQueue(50);
for(int i = 0; i < 10; i++){
Producer producer = new Producer(queue);
new Thread(producer).start();
}
for(int i = 0; i < 10; i++){
Consumer consumer = new Consumer(queue);
new Thread(consumer).start();
}
}
}
该方法锁定的资源是“message”还是“queue”?
两年前我也自己实现生产消费
后来发现有现成的东西
楼上有道理,我认为在consume和produce的结尾分别获得producer和consumer的锁,然后notify它们。在方法一开始唤醒不知道有什么意义。
<div class="quote_div">
<p>java多线程一般都会讲消费者-生产者模型<br><br>生产者与消费者模型中,要保证以下几点:<br>1 同一时间内只能有一个生产者生产<br>2 同一时间内只能有一个消费者消费<br>3 生产者生产的同时消费者不能消费<br>4 消息队列满时生产者不能继续生产<br>5 消息队列空时消费者不能继续消费</p>
<p> </p>
<p>---------------------------------------------</p>
<p>除了4和5,其他都不是必要条件.实际上,更多的生产者消费者应用都不遵循1,2,3.<br></p>
</div>
<p> </p>
发表评论
-
认真阅读hadoop源码
2012-11-01 16:00 1791从新复习hadoop,认真阅读hadoop源码,有兴趣的朋友可 ... -
铁道部售票网站怎么啦?
2012-01-10 10:25 1884乐淘CTO李勇:库存同步是难点 我的判断,除了 ... -
eclipse启动报错jvm terminated. Exit code=1
2011-10-11 08:55 1236转载链接: http://wxmfly.itey ... -
ireport中获取当前时间
2011-08-28 11:53 5178一。 iReport 中获取系统当前时间 1,选择Tex ... -
ireport引java bean database
2011-08-27 10:38 1756今天帮一同事调试程序,他们的报表工具用的是ireport4.0 ... -
谈谈爬虫的设计
2011-08-07 22:27 2326网络蜘蛛现在开源的已 ... -
为了养家,只能这样!
2011-07-03 16:22 16还是一直在玩数据,hadoop平台(自己一手搭建),使用爬虫n ... -
陆续整理数据方面的资料
2011-05-07 08:58 639差不多有一个多月没写东西了,最近比较忙!还是研究数据一些东西。 ... -
挣钱养家
2011-04-14 22:19 1167如果各位有私活的话忙不过来,可以通过QQ(282215036) ... -
使用perl连接mysql数据库
2011-04-05 22:21 1444用Perl DBI连接MySQL数据库 Perl中一个最酷的 ... -
图像数字识别技术
2011-04-01 17:32 5945最近在研究图像数字识别技术,对于一些简单没有干扰的图片,可以读 ... -
100个可供选择的搜索引擎
2011-03-02 13:11 1525本文根据 readwriteweb ... -
对于处理问题的一点想法
2011-02-23 08:26 1125昨天快下班的时候,遇到一个建立索引的问题,因为快下班了,我没有 ... -
温故而知新
2011-02-20 16:44 1197又回过头来复习以前的知识了?在家里实在无聊!把之前学习过的东西 ... -
加钱也得买票回家过年
2011-01-25 08:44 989昨天从黄牛党手上拿了一张高价票。加了100.哎!这年头在外面忙 ... -
Eclipse3.6 Helios SVN插件–Subversive
2011-01-12 11:42 3659刚在Google Code上发布了一个Open Project ... -
博客有时候来不及更新,希望大家见谅!
2011-01-10 17:42 1018刚到新公司,可能开始忙了,博客有时候来不及更新,希望大家见谅! ... -
新公司入职第一天
2011-01-10 11:47 1337今天是我去新公司入职的第一天。感觉一切都是新的,从头开始!加油 ... -
java中各种算法的实现
2010-12-30 13:01 1168选择排序算法的JAVA实现 viewplainprin ... -
java基础知识复习
2010-12-30 13:00 1025学习Java一 配置环境变量 学习Java二 开发第一 ...
相关推荐
总之,Java中的生产者-消费者模式是多线程编程中解决数据共享和同步问题的有效手段,通过合理利用`BlockingQueue`等并发工具类,我们可以构建高效、稳定的多线程应用。在开发过程中,了解和掌握这种模式有助于提高...
本示例中的“生产者-消费者”模型是一种经典的多线程问题,它模拟了实际生产环境中的资源分配与消耗过程。下面我们将详细探讨如何在Java中实现这个模型。 首先,我们要理解生产者-消费者模型的基本概念。在这个模型...
在并发编程中,"生产者-消费者"模式是一种经典的解决问题的范式,用于协调两个或更多线程间的协作,其中一部分线程(生产者)生成数据,另一部分线程(消费者)消费这些数据。 生产者-消费者模型的核心在于共享资源...
Java 多线程主题1- Java 多线程启动线程2- Java 多线程Volatile – 基本线程通信3- Java 多线程同步4- Java 多线程锁对象5- Java 多线程线程池6- Java 多线程倒计时闩锁7- Java 多线程生产者-消费者8- Java 多线程...
java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...
生产者消费者模型是一种经典的线程同步问题,它模拟了实际生活中的生产过程和消费过程,使得生产者线程可以将数据生产出来,而消费者线程则负责消耗这些数据,两者之间通过共享数据结构进行协同工作。 生产者消费者...
Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java...
在本示例中,“java多线程例子-生产者消费者”旨在展示如何利用多线程来实现生产者和消费者模式。这种模式是并发编程中的经典设计模式,用于协调生产数据和消费数据的两个不同线程。 生产者消费者模式的基本概念是...
### Java多线程-生产者与消费者问题 #### 一、生产者与消费者问题概览 **1.1 概要** 生产者与消费者问题是计算机科学中一个多线程同步的经典问题。它描述了两个线程如何共享有限资源的场景:一个是生产者...
总结来说,“java多线程(生产者与消费者)”是关于如何在Java中使用同步、线程间通信和共享资源来实现高效且安全的并发编程。通过理解并熟练应用这些概念和工具,开发者可以构建出能够充分利用多核处理器能力的高...
总的来说,理解和掌握生产者消费者问题及其解决策略是Java多线程编程的重要部分,这不仅有助于编写高效、可靠的并发代码,也是提升软件设计能力的关键一步。通过不断实践和学习,开发者能够更好地应对复杂的并发场景...
java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...
本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费者问题是经典的并发问题之一,它涉及到两个类型的线程:生产者和消费者。生产者负责生成数据(产品),而消费者则...
在实际应用中,我们常常会遇到一种典型的多线程问题——生产者消费者模型。这个模型描述了两种类型的线程:生产者线程负责创建或生产资源,而消费者线程则负责消耗这些资源。在Java中,我们可以利用同步机制来实现...
在Java多线程编程中,消费者-生产者模型是一种经典的线程间通信模式,用于解决多线程环境下的数据共享问题。该模型涉及到两个主要的角色:生产者(Producer)和消费者(Consumer)。生产者负责创建数据,而消费者则...
生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...
通过学习和实践"生产者-消费者"模型,开发者能够更好地理解和掌握Java多线程的精髓,为构建高并发、高效率的应用打下坚实的基础。在实际项目中,这种模型常被用于实现缓存管理、消息队列以及数据库连接池等场景。
用java多线程,实现生产者消费者同步和互斥的问题,操作系统中的经典问题
在本场景中,我们关注的是一个经典的多线程问题——"生产者-消费者"模式。这个模式是解决资源管理与同步问题的一个有效策略,它在操作系统、并发编程和分布式系统等领域广泛应用。 生产者-消费者模型涉及到两个主要...