[笔记][Java7并发编程实战手册]2.4在同步代码中使用条件-生产者与消费者
来源:互联网 发布:企查查软件下载 编辑:程序博客网 时间:2024/05/29 04:57
[笔记][Java7并发编程实战手册]系列目录
说明
在并发编程中一个典型的问题是生产者–消费者问题。在程序中,有可能会需要用到两个线程通信的情况,比如生产者消费者中,获取一个共享数据,有就消费。没有就等待着生产者生产之后再继续消费。那么这个实现过程就可以使用wait();notify();notifyAll()来达到效果;
以上方法详细解说请查看: Java多线程系列–“基础篇”05之 线程等待与唤醒
例子
/** * Created by zhuqiang on 2015/8/8 0008. */public class Client { public static void main(String[] args) { Storage st = new Storage(); new Thread(new Producer(st), "小红").start(); new Thread(new Consumer(st), "小名").start(); }}/** * 仓库 */class Storage { private int maxSize = 10; //仓库最大容量 private LinkedList<Date> st = new LinkedList<Date>(); //仓库存储 /** 生产 */ public synchronized void producer() { while (st.size() > maxSize) { try { System.out.println(Thread.currentThread().getName() + " : 仓库满了,生产着等待生产中"); this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } st.push(new Date()); System.out.println(Thread.currentThread().getName() + " : 生产了一个商品"); this.notifyAll(); //唤醒其他等待的线程 } /** 消费 */ public synchronized void consumer() { while (st.size() == 0) { // 要注意这里, 进来一次,就要循环的判断如果一直没有库存,则一直等待,因为notifyAll()是唤醒所在在此监视器锁上等待的线程,有可能抢到资源的还是当前线程 try { System.out.println(Thread.currentThread().getName() + " : 正在等待商品:当前商品数量:" + st.size()); this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName() + " : 消费商品:" + st.pop()); this.notifyAll(); //唤醒其他等待线程(唤醒 生产者) } public int getMaxSize() { return maxSize; } public void setMaxSize(int maxSize) { this.maxSize = maxSize; } public LinkedList<Date> getSt() { return st; } public void setSt(LinkedList<Date> st) { this.st = st; }}/** 生产者 */class Producer implements Runnable { private Storage st; public Producer(Storage st) { this.st = st; } @Override public void run() { /*for (int i = 1;i <=50;i++)*/ while (true) { st.producer(); } }}/** 消费者 */class Consumer implements Runnable { private Storage st; public Consumer(Storage st) { this.st = st; } @Override public void run() { /*for (int i = 1;i <=50;i++)*/ //这里不能使用循环多少次来模拟,不然会出现(假死锁),假如生产者的循环次数先循环完,那么消费者的循环次数还没有循环完,而又没有商品了,那么消费者则一直等待。没有人唤醒 while (true) { st.consumer(); } }}
说明:
上面示例大致逻辑:生产者不停的生产给仓库,仓库容量是10,达到最大容量则暂停生产;
消费者,不停的消费,仓库中有商品的时候才可以消费,否则等待;
0 0
- [笔记][Java7并发编程实战手册]2.4在同步代码中使用条件-生产者与消费者
- 并发编程--在同步代码中使用条件实现生产者消费者
- Java并发编程-07-在同步代码中使用条件--生产者-消费者问题
- [笔记][Java7并发编程实战手册]3.5 在集合点的同步CyclicBarrier循环barrier
- [笔记][Java7并发编程实战手册]2.2使用syncronized实现同步方法
- [笔记][Java7并发编程实战手册]2.5使用Lock实现同步一
- [笔记][Java7并发编程实战手册]2.5使用Lock实现同步二
- Java并发编程-10-在锁中使用多条件-生产者消费者问题
- [笔记][Java7并发编程实战手册]第三章-线程同步辅助类-3.1概要
- [笔记][Java7并发编程实战手册]6.并发集合
- [笔记][Java7并发编程实战手册]7. 定制并发类
- [笔记][Java7并发编程实战手册]4.4 在执行器中执行任务并返回结果Callable、Future
- [笔记][Java7并发编程实战手册]4.7-4.8 在执行器中延迟执行或则周期执行任务ScheduledThreadPoolExecutor
- [笔记][Java7并发编程实战手册]4.9-4.10在执行器中控制任务的完成和取消任务FutureTask
- [笔记][Java7并发编程实战手册]系列目录
- JAVA7并发编程手册笔记
- [笔记][Java7并发编程实战手册]4.11-4.12在执行器中分离任务的启动和结果的处理和处理在执行器中被拒绝的任务
- Java7并发编程--2、锁中使用多条件condition
- POM
- ssh登陆提示"Host key verification failed."的解决方法
- 循环小数 南阳oj329 【KMP next数组的应用】
- 大学生投注“互联网+”营销QQ推动传统企业转型
- macox下编译snappy静态库
- [笔记][Java7并发编程实战手册]2.4在同步代码中使用条件-生产者与消费者
- Leetcode -- Integer to Roman
- HTML5的canvas实现一个球的左右移动
- 算法竞赛入门经典(第二版) 习题3-5 谜题(Puzzle) UVa227 Finals1993
- Spring AOP(2)动态代理
- JS实现动态添加图片上传,多个单图添加
- UVA 11624
- ZOJ 题目3228 Searching the String(AC自动机,子川匹配个数)
- hdoj-1686 Oulipo