JAVA并发实现五(生产者和消费者模式wait和notify方式实现)
package com.subject01; import java.util.PriorityQueue; /**
* 通过wait和notify 实现
* 生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,
* 生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,
* 那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去。
* 因此,一般情况下,当队列满时,会让生产者交出对临界资源的占用权,并进入挂起状态。
* 然后等待消费者消费了商品,然后消费者通知生产者队列有空间了。
* 同样地,当队列空时,消费者也必须等待,等待生产者通知它队列中有商品了。这种互相通信的过程就是线程间的协作。
* com.subject01.CusAndPro.java
* @author 孙涛
* 2016年5月10日
*/
public class CusAndPro { private int queueSize = 10 ;
private PriorityQueue<Integer> queue = new PriorityQueue<Integer>(queueSize); public static void main(String[] args) {
CusAndPro cap = new CusAndPro();
Consumer cus = cap.new Consumer();
Producer pro = cap.new Producer();
Thread cusT = new Thread(cus);
Thread proT = new Thread(pro); proT.start();
cusT.start();
}
/**
* 消费者
* com.subject01.CusAndPro.java
* @author 孙涛
* 2016年5月10日
*/
class Consumer implements Runnable{ @Override
public void run() {
cousume();
} private void cousume() {
while(true){
synchronized (queue) {
while(queue.size() ==0){
try {
System.out.println("队列空,等待数据。。。");
queue.wait();
} catch (InterruptedException e) {
e.printStackTrace();
queue.notify();
}
} queue.poll() ;
queue.notify();
System.out.println("从队列中取走一个元素,队列中剩余"+queue.size()+"个");
}
}
} }
/**
* 生产者
* com.subject01.CusAndPro.java
* @author 孙涛
* 2016年5月10日
*/
class Producer implements Runnable{ @Override
public void run() {
produce();
} private void produce() {
while(true){
synchronized(queue){
while(queue.size() == queueSize){
try {
System.out.println("队列已满,等待空余的空间");
queue.wait();
} catch (InterruptedException e) {
e.printStackTrace();
queue.notify();
}
} queue.offer(1); // 每次插入一个元素
queue.notify();
System.out.println("向队列取中插入一个元素,队列剩余空间:"+(queueSize-queue.size()));
}
}
} }
}
JAVA并发实现五(生产者和消费者模式wait和notify方式实现)的更多相关文章
- JAVA并发实现五(生产者和消费者模式Condition方式实现)
package com.subject01; import java.util.PriorityQueue; import java.util.concurrent.locks.Condition; ...
- Java并发编程(4)--生产者与消费者模式介绍
一.前言 这种模式在生活是最常见的,那么它的场景是什么样的呢? 下面是我假象的,假设有一个仓库,仓库有一个生产者和一个消费者,消费者过来消费的时候会检测仓库中是否有库存,如果没有了则等待生产,如果有就 ...
- Java多线程设计模式(2)生产者与消费者模式
1 Producer-Consumer Pattern Producer-Consumer Pattern主要就是在生产者与消费者之间建立一个“桥梁参与者”,用来解决生产者线程与消费者线程之间速度的不 ...
- 生产者与消费者模式-阻塞 wait,notify
设计思路:生产者push ,消费者 拿,篮子装,syncstack先进后出,while 判断 index=0 wait, 当 Producer生产了 并push到篮子里 notify(唤醒 ...
- python生产者和消费者模式实现(二)多进程方式
import timeimport randomfrom multiprocessing import Process, Queue # 生产者def producer(q, i): food = ' ...
- python生产者和消费者模式实现(一)普通方式
import timeimport randomfrom multiprocessing import Queue # 生产者def producer(q, num): for i in range( ...
- java 线程并发(生产者、消费者模式)
线程并发协作(生产者/消费者模式) 多线程环境下,我们经常需要多个线程的并发和协作.这个时候,就需要了解一个重要的多线程并发协作模型“生产者/消费者模式”. Ø 什么是生产者? 生产者指的是负责生产数 ...
- java进阶(40)--wait与notify(生产者与消费者模式)
文档目录: 一.概念 二.wait的作用 三.notify的作用 四.生产者消费者模式 五.举例 ---------------------------------------分割线:正文------ ...
- java生产者与消费者模式
前言: 生产者和消费者模式是我们在学习多线程中很经典的一个模式,它主要分为生产者和消费者,分别是两个线程, 目录 一:生产者和消费者模式简介 二:生产者和消费者模式的实现 声明:本例来源于java经典 ...
随机推荐
- DB2完美卸载
会安装,也要会卸载.详细的安装说明不多,我这个我觉得写得还算全. 准备工作. 1.用 ps -ef|grep db2 找出db2安装目录 2. ./db2level 查出DB2的 ...
- 邮件协议(SMTP)性能测试总结(Foxmail邮箱)
先介绍一下邮件协议SMTP的工作机制(连接和发送过程),用wireshark工具抓包进行分析,如下: SMTP协议的工作机制(连接和发送过程): 1.建立TCP连接,并将邮件服务器地址给客户端: 2. ...
- Android(java)学习笔记262:JNI之工具快速开发步骤
下面通过一个案例说明一下,利用工具jni快速开发步骤 1.新建一个Android工程,命名为"03_对int数组加1",如下: 2. 在MainActivity.java中对add ...
- Hibernate简单的基础理论
和Hibernate有关的概念,是掌握Hibernate必须了解的知识.就个人经验来说,可以在了解如何简单开发Hibernate之后,再来学习这些概念,这样可以有个比较清楚的认识.Hibernate是 ...
- 前端bug记录---不定时更新
在项目的开发中难免遇到各种各样的bug,我觉得还是有必要记录一下的,方便日后查询. safari window resize 为满足日常轮播需求,做一个符合当前业务的轮播插件,其中需要考虑windo ...
- javascript 冒泡和事件源 形成的事件委托
冒泡:即使通过子级元素的事件来触发父级的事件,通过阻止冒泡可以防止冒泡发生. 事件源:首先这个东西是有兼容行问题的,当然解决也很简单. 两者结合使用,形成的事件委托有两个优势: 1.减少性能消耗: 2 ...
- RecycleView 瀑布流滑动移位
RecycleView StaggeredLayoutManager(瀑布流)滑动的时候,默认会出现item移动的问题,需以下来个步骤来解决: 附上StaggeredLayoutManager中的一段 ...
- MS SQL到Oracle的数据迁移笔记
MS SQL到Oracle的数据迁移笔记 一.任务背景 旧系统使用MS SQL Server数据库,新系统使用Oracle数据库,现在需要将旧系统中的数据迁移到新系统中,旧数据按照约定的规则转换后,能 ...
- TEXT类型
创建文档document.createTextNode("直接就是想打的文本") 然后用 appendChild() 再然后就是一些其他的方法 appendData(a)在a里面直 ...
- 你好,C++(20).4.2.2 表达并列条件选择的switch语句:如果……如果……如果……
4.2.2 表达并列条件选择的switch语句:如果……如果……如果…… 在现实世界中,还有这样一类特殊的条件选择: 如果明天是晴天,我就穿T恤: 如果明天是阴天,我就穿衬衣: 如果明天是雨天,我就 ...