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

实现方法:使用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. redis的集群:

    集群策略:主从复制哨兵集群 参考:https://blog.csdn.net/q649381130/article/details/79931791 集群又分为如下:客户端分片基于代理的分片路由查询参 ...

  2. android五子棋游戏、资讯阅读、大学课程表、地图拖拽检测、小说搜索阅读app等源码

    Android精选源码 Android 自动生成添加控件 android旋转动画.圆形进度条组合效果源码 一款很强的手机五子棋app源码 android地图拖拽区域检测效果源码 实现Android大学 ...

  3. 2010提高组-C]关押罪犯(扩展域并查集

    题:https://www.cometoj.com/problem/0073 #include<bits/stdc++.h> using namespace std; ; struct n ...

  4. pytorch中的view函数和max函数

    一.view函数 代码: a=torch.randn(,,,) b = a.view(,-) print(b.size()) 输出: torch.Size([, ]) 解释: 其中参数-1表示剩下的值 ...

  5. 牛客-DongDong数颜色 及其相似题

    大佬博客 ps:在牛客上做到这题不会,学会之后补了两道相关题.顺便记录一下. 牛客-DongDong数颜色 sol:dfs序+莫队,先把树上的点标上dfs序,因为子树的dfs序是连续的,所以子树可以表 ...

  6. Java IO: 其他字符流(下)

    作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中的PushbackReader,LineNumberReader,St ...

  7. maven 多bundle项目

    1 环境 eclipse maven jdk1.8 多bundle项目需要一个父项目(聚合模块),起到聚合其他模块的作用,其他模块的管理工具,不包含实际的代码. 新建maven项目-->Crea ...

  8. ionic3 生命周期钩子

    ionViewDidLoad 页面加载完成触发,这里的"加载完成"指的是页面所需的资源已经加载完成,但还没进入这个页面的状态(用户看到的还是上一个页面). 需要注意的是它是一个很傲 ...

  9. Mybatis-Plus的分页插件

    使用的是:Mybatis-Plus的分页插件https://baomidou.gitee.io/mybatis-plus-doc/#/?id=%E7%AE%80%E4%BB%8B 1.Mapper.j ...

  10. 吴裕雄--天生自然python编程:pycharm常用快捷键问题

    最近在使用pycharm的时候发现不能正常使用ctrl+c/v进行复制粘贴,也无法使用tab键对大段代码进行整体缩进.后来发现是因为安装了vim插件的问题,在setting里找到vim插件,取消勾选即 ...