- 浏览: 478164 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
fanxp:
很好,学习了!
mysql导入数据load data infile用法 -
maomao15:
...
(转) Class.getResource与ClassLoader.getResource()区别 -
贾懂凯:
有maven的配置吗?
Spring MVC整合Velocity的例子 -
kevinhrw:
一个好办法不知道使用"mvc:resources&q ...
Spring3.0 做rest时候拦截js、图片 -
love_miaohong:
这样子设置没作用啊, window7系统下用这个方式不行
MongoDB在windows操作系统cmd下乱码
生产者与消费者模型中,要保证以下几点:
(1)同一时间内只能有一个生产者生产。
(2)同一时间内只能有一个消费者消费。
(3)生产者生产的同时消费者不能消费。
(4)消息队列满时生产者不能继续生产,消息队列空时消费者不能继续消费,此时必须等待。
代码:
1、Message.java
view plaincopy to clipboardprint?
package com.test;
/**
* 消息对象
*
*/
public class Message {
private int id;
private String message;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
package com.test;
/**
* 消息对象
*
*/
public class Message {
private int id;
private String message;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
2、Queue.java
view plaincopy to clipboardprint?
package com.test;
import java.util.ArrayList;
import java.util.List;
/**
* 存放消息的缓存队列,共享资源
*
*/
public class Queue {
private List<Message> list = new ArrayList<Message>();
private int maxCount = 5;
/**
* 生产
* @param message
*/
public synchronized void product(Message message){
this.notifyAll();
while (maxCount == getList().size()) {
System.out.println(Thread.currentThread().getName()+",队列已满,等待中。。。。");
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
getList().add(message);
System.out.println(Thread.currentThread().getName()+",正在生产。。。队列当前个数:"+getList().size());
}
/**
* 消费
*/
public synchronized void consume(){
this.notifyAll();
while(getList().size()==0){
System.out.println(Thread.currentThread().getName()+",队列为空,等待中。。。");
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Message message = getList().get(0);
getList().remove(message);
System.out.println(Thread.currentThread().getName()+",正在消费。。。队列当前个数:"+getList().size());
}
public List<Message> getList() {
return list;
}
public void setList(List<Message> list) {
this.list = list;
}
public int getMaxCount() {
return maxCount;
}
public void setMaxCount(int maxCount) {
this.maxCount = maxCount;
}
}
package com.test;
import java.util.ArrayList;
import java.util.List;
/**
* 存放消息的缓存队列,共享资源
*
*/
public class Queue {
private List<Message> list = new ArrayList<Message>();
private int maxCount = 5;
/**
* 生产
* @param message
*/
public synchronized void product(Message message){
this.notifyAll();
while (maxCount == getList().size()) {
System.out.println(Thread.currentThread().getName()+",队列已满,等待中。。。。");
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
getList().add(message);
System.out.println(Thread.currentThread().getName()+",正在生产。。。队列当前个数:"+getList().size());
}
/**
* 消费
*/
public synchronized void consume(){
this.notifyAll();
while(getList().size()==0){
System.out.println(Thread.currentThread().getName()+",队列为空,等待中。。。");
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Message message = getList().get(0);
getList().remove(message);
System.out.println(Thread.currentThread().getName()+",正在消费。。。队列当前个数:"+getList().size());
}
public List<Message> getList() {
return list;
}
public void setList(List<Message> list) {
this.list = list;
}
public int getMaxCount() {
return maxCount;
}
public void setMaxCount(int maxCount) {
this.maxCount = maxCount;
}
}
3、Producer.java
view plaincopy to clipboardprint?
package com.test;
import java.util.Random;
/**
* 生产者生产
*
*/
public class Producer implements Runnable {
private Queue queue = null;
public Producer(Queue queue) {
this.queue = queue;
}
public void run() {
while (true) {
Message message = new Message();
message.setId(new Random().nextInt());
message.setMessage("message," + new Random().nextInt());
queue.product(message);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package com.test;
import java.util.Random;
/**
* 生产者生产
*
*/
public class Producer implements Runnable {
private Queue queue = null;
public Producer(Queue queue) {
this.queue = queue;
}
public void run() {
while (true) {
Message message = new Message();
message.setId(new Random().nextInt());
message.setMessage("message," + new Random().nextInt());
queue.product(message);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
4、Consumer .java
view plaincopy to clipboardprint?
package com.test;
/**
* 消费者消费
*
*/
public class Consumer implements Runnable {
private Queue queue;
public Consumer(Queue queue) {
this.queue = queue;
}
public void run() {
while (true) {
queue.consume();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package com.test;
/**
* 消费者消费
*
*/
public class Consumer implements Runnable {
private Queue queue;
public Consumer(Queue queue) {
this.queue = queue;
}
public void run() {
while (true) {
queue.consume();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
5、Test.java
view plaincopy to clipboardprint?
package com.test;
public class Test {
public static void main(String[] args) {
Queue queue = new Queue();
// 生产者两个
Producer producer1 = new Producer(queue);
Producer producer2 = new Producer(queue);
// 消费者三个
Consumer consumer1 = new Consumer(queue);
Consumer consumer2 = new Consumer(queue);
Consumer consumer3 = new Consumer(queue);
Thread thread1 = new Thread(producer1,"producer1");
Thread thread2 = new Thread(producer2,"producer2");
Thread thread3 = new Thread(consumer1,"consumer1");
Thread thread4 = new Thread(consumer2,"consumer2");
Thread thread5 = new Thread(consumer3,"consumer3");
thread1.start();
thread2.start();
thread3.start();
thread4.start();
thread5.start();
}
}
发表评论
-
ThreadPoolExecutor线程池参数设置技巧
2017-12-19 13:06 1330一、ThreadPoolExecutor的重要参数 ... -
Java中如何设置使用代理IP发送网络请求
2016-04-20 10:45 2021Java中有两种方法可以实现用代理IP连接网络。 方式一, ... -
JDK并发工具包CompletionService和ExecutorCompletionService的好处和使用场景
2016-04-13 14:06 1817《Java并发编程实践》一书6.3.5节Complet ... -
HttpClient容易忽视的细节——连接关闭
2015-09-06 14:09 1117Java代码 HttpCl ... -
深入浅出 消息队列 ActiveMQ
2015-08-21 10:39 1364一、 概述与介绍 ActiveMQ 是Apach ... -
Java 代码 调用浏览器 打开url (支持多个操作系统)
2014-03-31 14:58 1909package com.ab.galaxy.test.mai ... -
Ant 实战
2013-10-22 10:13 829Ant是什么? Ant是一个构建工具,它可以帮助我们 ... -
30天轻松掌握JavaWeb
2013-10-22 10:07 1136Java Web,是用Java技术来解决相关we ... -
在线文档 doc.gotomao.com
2013-06-24 23:00 71http://doc.gotomao.com/ -
(转) Class.getResource与ClassLoader.getResource()区别
2013-06-04 22:14 1666class.getResource(String res)的 ... -
(转)PV,V,UV的概念,采集数据
2012-10-23 13:08 1176GUID IP+ 随机数 ... -
【转】Atlassian Confluence安装以及如何更改数据库
2012-08-22 16:14 2912Confluence是一个国外的一款商业wiki软 ... -
gzip解压
2011-07-26 12:06 674GZIPInputStream GIS=new GZIPInp ... -
MongoDB在windows操作系统cmd下乱码
2011-05-03 14:13 2901原因:由于mongodb后台的字符编码都是utf-8的, ... -
设计自己的Annotation
2011-04-05 11:37 715Annotation在java的世界正铺天盖地展开 ... -
jstl 的 <fn:> 标签应用(转)
2011-01-09 19:08 1037在jsp页面上经常遇到得到集合长度、字符长度、字符 ... -
mencached入门 pdf
2011-01-03 20:19 959见附件 -
让FCKeditor自动换行
2010-12-21 10:03 1575使用FCKEditor进行文本编辑时,当输入满一行时, ... -
Apache POI组件操作Excel,制作报表(二) (转)
2010-12-19 20:26 2005现在来看看Excel的基本设置问题,以2007为例,先从工作 ... -
Apache POI组件操作Excel,制作报表(一) (转)
2010-12-19 19:32 1162Apache的POI组件是Java操作Microsoft ...
相关推荐
本代码是用JAVA实现的生产者与消费者的问题,线程间的同步与互斥功能
a: 创建一个线程 ...h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more 生产者消费者问题 (1生产者 2消费者 4缓冲区) problem2 读者与写着问题 I: 信号量 semaphore 解决线程同步问题
java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...
java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...
编写一个“生产者-消费者”的多线程演示程序,两个生产者,一个消费者,可以存放产品的仓库容量为10,仓库用栈实现,并有同步功能,且能防止先消费后生产的情况。
java多线程实现生产者和消费者
基本满足操作系统课上要求,java实现的生产者消费者模型。
本实验要求设计在同一个进程地址...生产者线程生产物品时,若无空缓冲区可用,生产者线程必须等待消费者线程释放出一个空缓冲区;消费者线程消费物品时,若缓冲区为空,消费者线程将被阻塞,直到新的物品被生产出来。
用java多线程简易实现生产者消费者模式的代码,用java多线程简易实现生产者消费者模式的代码。
用java多线程,实现生产者消费者同步和互斥的问题,操作系统中的经典问题
使用wait()和notify()实现的生产者与消费者模型,可以了解如何使用wait()和notify()进行线程间通信。(上一次上传的代码有一个问题没有考虑到,这次修补了——CSDN没法撤销资源,只能再上传了)
本例将模仿经典的线程同步互斥例子——生产者和消费者问题,来演示 java 强大的多线程机制。生产者和消费者共享一个数据,当数据为0 时,消费者不可访问,生产者可访问数据,每次访问数据加1;当数据到达100 时,...
操作系统实验 多线程同步与互斥 java编写 可动态创建
在linux上分别用多进程和多线程实现的同步互斥操作(源代码)
java多线程实现生产者消费者关系,完成线程之间的同步。
用Java实现消费者与生产者两个线程进行调度
上课实验用VC++做的操作系统实验之进程的互斥与同步(生产者与消费者问题),内含实验报告,希望对大家有帮助
多线程实现生产者消费者模型:锁(Lock)、信号量(Semaphore、BoundedSemaphore)、条件(Condition)、队列(Queue)、事件(Event) 多进程程实现生产者消费者模型:信号量(Semaphore)、条件(Condition)、...
java 多线程生产者消费者模型demo
使用多线程实现了生产者和消费者模式