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经典 ...
 
随机推荐
- Horizontal,vertical,Input_Mouse,Input_Key
			
鼠标获取 using UnityEngine; using System.Collections; public class Input_Mouse : MonoBehaviour { void Up ...
 - Android文字的复制和粘贴
			
Android中提供了简单的额复制粘贴功能.代码很简单 复制文字的代码: ClipboardManager cbm= (ClipboardManager) MainActivity.this .get ...
 - 自定义控件 进度条 ProgressBar-2
			
使用 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:bqt ...
 - Tabs( 选项卡)
			
一. 加载方式 //class 加载方式<div id="box" class="easyui-tabs" style="width:500px ...
 - web前端之文件上传
			
前言 最近太忙一直没时间认真的写博客(哈哈哈),最近pm提一个需求,移动端需要一个上传图片的功能,允许多选.删除.预览.点击查看大图并可以滑动.虽然听起来很多,但是这个功能在web上实现过啊,使用we ...
 - 关于textbox.attributes["value"]的问题
			
在“修改”时,出现这个问题,后台点击修改时,应该是文本框出现一些初始值 BLL.manager bll = new BLL.manager(); Model.manager model = bll.G ...
 - 从Ueditor跨域上传,总结的一次跨域上传的爬坑经历
			
项目内其中一个管理后台需要发布文章,需要一个富文本编辑器,经过一番选择后,最终选择了百度的Ueditor. 由于上传的文件是上传到另一台专门存放图片等静态资源的服务器上面的,所以就涉及到了跨域上传. ...
 - chkconfig(check config)命令
			
功能说明:chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 语 法:chkconfig ...
 - oracle nvl()函数在使用中出现的问题
			
看一条sql select q.*, r.goods_name from (select nvl(t.goods_code, s.goods_code) goods_code, t.buy_open_ ...
 - jQuery Scroll div滚动条样式更改
			
<script type="text/javascript" src="js/jquery-1.2.6.min.js"></script> ...