Java实现生产者消费者(一)
问题描述:生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间为空时,消费者阻塞,当存储空间满时,生产者阻塞
实现方法:使用synchronized关键字结合wait()和notify()实现
生产者代码:
class Producer implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
for(int i = 1;i <= 10; i++) {
System.out.println("生产者第" + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
synchronized (lock) {
while(count >= max) { //防止假唤醒(唤醒之后发现条件不满足)
try {
lock.wait(); //释放锁
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
count++;
System.out.println("生产者:" + Thread.currentThread().getName() + "完成生产:"+i+",当前count=" + count );
lock.notifyAll();
}
}
}
}
消费者代码:
class Consumer implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
for(int i = 1;i <= 10; i++) {
System.out.println("消费者第" + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
synchronized (lock) {
while(count == 0) { //防止假唤醒(唤醒之后发现条件不满足)
try {
lock.wait(); //释放锁
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*不要用if语句
if(count == 0) {
try {
lock.wait();
} catch (Exception e) {
// TODO: handle exception
}
}
*/
count--;
System.out.println("消费者:" + Thread.currentThread().getName() + "完成消费"+i+",当前count=" + count );
lock.notifyAll();
}
}
}
}
运行主程序:
public static void main(String[] args) {
// TODO Auto-generated method stub
ConsumerAndProducer test = new ConsumerAndProducer();
new Thread(test.new Producer(),"生产者1").start();
new Thread(test.new Producer(),"生产者2").start();
new Thread(test.new Producer(),"生产者3").start();
new Thread(test.new Consumer(),"消费者1").start();
new Thread(test.new Consumer(),"消费者2").start();
new Thread(test.new Consumer(),"消费者3").start();
}
输出:
生产者:生产者1完成生产:1,当前count=1
生产者:生产者2完成生产:1,当前count=2
生产者:生产者3完成生产:1,当前count=3
消费者:消费者3完成消费1,当前count=2
消费者:消费者2完成消费1,当前count=1
消费者:消费者1完成消费1,当前count=0
生产者:生产者1完成生产:2,当前count=1
生产者:生产者2完成生产:2,当前count=2
生产者:生产者3完成生产:2,当前count=3
消费者:消费者3完成消费2,当前count=2
消费者:消费者1完成消费2,当前count=1
消费者:消费者2完成消费2,当前count=0
生产者:生产者1完成生产:3,当前count=1
生产者:生产者3完成生产:3,当前count=2
生产者:生产者2完成生产:3,当前count=3
消费者:消费者2完成消费3,当前count=2
消费者:消费者1完成消费3,当前count=1
消费者:消费者3完成消费3,当前count=0
生产者:生产者1完成生产:4,当前count=1
生产者:生产者2完成生产:4,当前count=2
生产者:生产者3完成生产:4,当前count=3
消费者:消费者1完成消费4,当前count=2
消费者:消费者3完成消费4,当前count=1
消费者:消费者2完成消费4,当前count=0
生产者:生产者1完成生产:5,当前count=1
生产者:生产者2完成生产:5,当前count=2
生产者:生产者3完成生产:5,当前count=3
消费者:消费者3完成消费5,当前count=2
消费者:消费者1完成消费5,当前count=1
消费者:消费者2完成消费5,当前count=0
生产者:生产者1完成生产:6,当前count=1
生产者:生产者3完成生产:6,当前count=2
生产者:生产者2完成生产:6,当前count=3
消费者:消费者3完成消费6,当前count=2
消费者:消费者2完成消费6,当前count=1
消费者:消费者1完成消费6,当前count=0
生产者:生产者1完成生产:7,当前count=1
生产者:生产者2完成生产:7,当前count=2
生产者:生产者3完成生产:7,当前count=3
消费者:消费者3完成消费7,当前count=2
消费者:消费者2完成消费7,当前count=1
消费者:消费者1完成消费7,当前count=0
生产者:生产者1完成生产:8,当前count=1
生产者:生产者2完成生产:8,当前count=2
生产者:生产者3完成生产:8,当前count=3
消费者:消费者3完成消费8,当前count=2
消费者:消费者2完成消费8,当前count=1
消费者:消费者1完成消费8,当前count=0
生产者:生产者1完成生产:9,当前count=1
生产者:生产者3完成生产:9,当前count=2
生产者:生产者2完成生产:9,当前count=3
消费者:消费者3完成消费9,当前count=2
消费者:消费者1完成消费9,当前count=1
消费者:消费者2完成消费9,当前count=0
生产者:生产者1完成生产:10,当前count=1
生产者:生产者3完成生产:10,当前count=2
生产者:生产者2完成生产:10,当前count=3
消费者:消费者3完成消费10,当前count=2
消费者:消费者2完成消费10,当前count=1
消费者:消费者1完成消费10,当前count=0
Java实现生产者消费者(一)的更多相关文章
- Java实现生产者消费者问题与读者写者问题
摘要: Java实现生产者消费者问题与读者写者问题 1.生产者消费者问题 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从 ...
- Java设计模式—生产者消费者模式(阻塞队列实现)
生产者消费者模式是并发.多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据.这篇文章我们来看看什么是生产者消费者模式,这个问 ...
- java实现生产者消费者问题
引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...
- java实现生产者消费者问题(转)
引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...
- [转载] Java实现生产者消费者问题
转载自http://www.cnblogs.com/happyPawpaw/archive/2013/01/18/2865957.html 引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费 ...
- java实现生产者消费者模式
生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将 ...
- java 线程 生产者-消费者与队列,任务间使用管道进行输入、输出 解说演示样例 --thinking java4
package org.rui.thread.block2; import java.io.BufferedReader; import java.io.IOException; import jav ...
- Java 实现生产者 – 消费者模型
转自:http://www.importnew.com/27063.html 考查Java的并发编程时,手写“生产者-消费者模型”是一个经典问题.有如下几个考点: 对Java并发模型的理解 对Java ...
- Java——Java实现生产者消费者
1.生产/消费者模型 生产/消费者问题是个非常典型的多线程问题,涉及到的对象包括"生产者"."消费者"."仓库"和"产品" ...
- java多线程 生产者消费者模式
package de.bvb; /** * 生产者消费者模式 * 通过 wait() 和 notify() 通信方法实现 * */ public class Test1 { public static ...
随机推荐
- 电脑莫名重启,VS代码丢失的解决办法
今天写了一天的代码,然后电脑放在公司了,出去看电影(公司组织红色文化培训..)回来发现电脑重启,再打开电脑,VS的代码都不见了.好慌.... 别慌处理办法来了: 打开everything(没有的可以下 ...
- fedoar29配置漏洞平台webgoat
fedoar29配置漏洞平台webgoat 该环境基于java环境,故需要配置相应的java版本 查看java版本 1 java -version 结果如下: 123 openjdk version ...
- java基础之异常 · fossi
在开发中,异常处理是一个不可绕开的话题,我们对于异常的处理已经非常熟练了,对于异常本身的概念.用法等不再赘述了,直接结合面试问题来加深对异常的理解吧. Throwable 可以用来表示任何可以作为异常 ...
- [LC] 54. Spiral Matrix
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...
- DOCKER中centos7的中文支持
直接编写看下能否改变成识别中文字体 写到你的~/.bashrc里吧,然后重启终端(我写的是英文的啊,改成你要的) export LC_ALL=en_US.UTF-8 export LANGUAGE=e ...
- 吴裕雄--天生自然python编程:实例
# 该实例输出 Hello World! print('Hello World!') # 用户输入数字 num1 = input('输入第一个数字:') num2 = input('输入第二个数字:' ...
- 关于JavaScript中的基本类型
1.在JavaScript的数据中包含以下两种 1 基本类型 Number.Boolean.String.NULL.Undefined 以及ES6的 Symbol 2 引用类型 Object.Arra ...
- 初等数论-Base-2(扩展欧几里得算法,同余,线性同余方程,(附:裴蜀定理的证明))
我们接着上面的欧几里得算法说 扩展欧几里得算法 扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足贝祖等式\(^①\): ax+by = gcd(a, b) =d(解一定存在,根据数论中的 ...
- 原生 XMLHttpRequest
一.什么是XMLHttpRequest? XHR英文全名XmlHttpRequest,中文可以解释为可扩展超文本传输请求.Xml可扩展标记语言,Http超文本传输协议,Request请求.XMLHtt ...
- 日志框架之2 slf4j+logback实现日志架构 · 远观钱途
如何从缤纷复杂的日志系统世界筛选出适合自己的日志框架以及slf4j+logback的组合美妙之处?此文可能有帮助 logback介绍 Logback是由log4j创始人设计的另一个开源日志组件,官方网 ...