问题描述:生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间为空时,消费者阻塞,当存储空间满时,生产者阻塞

实现方法:使用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实现生产者消费者(一)的更多相关文章

  1. Java实现生产者消费者问题与读者写者问题

    摘要: Java实现生产者消费者问题与读者写者问题 1.生产者消费者问题 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从 ...

  2. Java设计模式—生产者消费者模式(阻塞队列实现)

    生产者消费者模式是并发.多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据.这篇文章我们来看看什么是生产者消费者模式,这个问 ...

  3. java实现生产者消费者问题

    引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...

  4. java实现生产者消费者问题(转)

    引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...

  5. [转载] Java实现生产者消费者问题

    转载自http://www.cnblogs.com/happyPawpaw/archive/2013/01/18/2865957.html 引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费 ...

  6. java实现生产者消费者模式

    生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将 ...

  7. java 线程 生产者-消费者与队列,任务间使用管道进行输入、输出 解说演示样例 --thinking java4

    package org.rui.thread.block2; import java.io.BufferedReader; import java.io.IOException; import jav ...

  8. Java 实现生产者 – 消费者模型

    转自:http://www.importnew.com/27063.html 考查Java的并发编程时,手写“生产者-消费者模型”是一个经典问题.有如下几个考点: 对Java并发模型的理解 对Java ...

  9. Java——Java实现生产者消费者

    1.生产/消费者模型 生产/消费者问题是个非常典型的多线程问题,涉及到的对象包括"生产者"."消费者"."仓库"和"产品" ...

  10. java多线程 生产者消费者模式

    package de.bvb; /** * 生产者消费者模式 * 通过 wait() 和 notify() 通信方法实现 * */ public class Test1 { public static ...

随机推荐

  1. 吴裕雄--天生自然python学习笔记:python爬虫PM2.5 实时监测显示器

    PM2.5 对人体的健康影响很大,所以空气中的 PM2.5 实时信息受到越来越多的关注. Python 的 Pandas 套件不但可以自动读取网页中的表格 数据 , 还可对数据进行修改.排序等处理,也 ...

  2. jquery框架概览(一)

    参照jQuery 2.0.3版本(http://files.cnblogs.com/files/snoy/jquery-2.0.3.js")来进行的源码分析 从代码的最外层可以看到是一个II ...

  3. 使用mybatis的动态sql解析能力生成sql

    需求: 计算平台,有很多表,打算提供一个基于sql的服务接口, sql不能完全在配置页面写死, 要能根据参数不同执行不同的语义,防止sql个数爆炸 把mybatis原码down下来, 改造一下测试用例 ...

  4. warning: LF will be replaced by CRLF in ** 的原因及解决办法

    https://blog.csdn.net/man_zuo/article/details/88651416

  5. Linux下Centos 7如何关闭防火墙?

    Linux下的防火墙有两种:Iptables和Firewall(概念以及区别大家可以自行搜索).为什么要关闭防火墙呢?主要是我们都过Linux搭建服务器的时候其他机器访问会被墙掉,例如:Tomcat, ...

  6. 剖析String,StringBuffer,StringBuilder异同

    近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下,便 ...

  7. CAD安装未完成,某些产品无法安装的解决方法

    CAD提示安装未完成,某些产品无法安装该怎样解决呢?,一些朋友在win7或者win10系统下安装CAD失败提示CAD安装未完成,某些产品无法安装,也有时候想重新安装CAD的时候会出现本电脑window ...

  8. Jquery中$(document).ready() 和 JavaScript中的window.onload方法 比较

    Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,不过与window.onload方法还是有区别的.   1.执行时间 win ...

  9. Query对象与DOM对象之间的转换

    什么是jQuery对象? ---就是通过jQuery包装DOM对象后产生的对象.jQuery对象是jQuery独有的,其可以使用jQuery里的方法. 比如: $("#test") ...

  10. cisco WLC开启portal认证,但是访问https无法跳转问题的解决

     config network web-auth https-redirect enable版本8,及以上才支持  官方文档: http://www.cisco.com/c/zh_cn/support ...