Java多线程使用wait和notify实现生产者消费者模型
Java多线程使用wait和notify这两个关键字的学习,通过实现生成者与消费者来成对研究比较科学。
从两个字的意义来讲就是等待与通知这个简单道理。
现在先模拟一个缓存区存储,是用一个list实现的,基本逻辑是当list中数据最大的时候,就等待消费者获取数据并移除数据,然后通知生产者继续生产数据。
代码如下:
package com.ming.thread.t3.waitandnotify; import java.util.Date;
import java.util.LinkedList;
import java.util.List; /**
* 先建立一个缓冲区的存储
* @author mingge
*
*/
public class BufferStorage { private int maxSize=0; private List<String> list; public BufferStorage(int maxSize){
this.maxSize=maxSize;
list=new LinkedList<>();
} synchronized public void set(String str){
while(list.size()==maxSize){//当list中装的数据最大时,就等待消费者线程
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
list.add(str+":"+new Date().getTime());
System.out.printf("Set: %d",list.size());
System.out.println();
notifyAll();
} synchronized public void get(){
while(list.size()==0){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.printf("Get: %d: %s",list.size(),((LinkedList<?>)list).poll()); //poll 先得到数据,在remove数据
notifyAll();
} }
package com.ming.thread.t3.waitandnotify; /**
* 建立一个生产者线程
* @author mingge
*
*/
public class ProducerThread extends Thread{ BufferStorage bufferStorage; public ProducerThread(BufferStorage bufferStorage){
super();
this.bufferStorage=bufferStorage;
super.setName("ProducerThread");
} public void run(){
for(int i=0;i<200;i++){
bufferStorage.set("mingge:");
}
}
}
package com.ming.thread.t3.waitandnotify; /**
* 建立一个消费者线程
* @author mingge
*
*/
public class CustomerThread extends Thread{ BufferStorage bufferStorage; public CustomerThread(BufferStorage bufferStorage){
super();
this.bufferStorage=bufferStorage;
super.setName("CustomerThread");
} public void run(){
for(int i = 0; i < 200; i++) {
bufferStorage.get();
}
} }
package com.ming.thread.t3.waitandnotify; public class Test { public static void main(String[] args) {
BufferStorage bufferStorage=new BufferStorage(10);
ProducerThread producerThread=new ProducerThread(bufferStorage);
CustomerThread customerThread=new CustomerThread(bufferStorage);
producerThread.start();
customerThread.start();
}
}
嗨。。。明白原理就是了......
Java多线程使用wait和notify实现生产者消费者模型的更多相关文章
- Java多线程-同步:synchronized 和线程通信:生产者消费者模式
大家伙周末愉快,小乐又来给大家献上技术大餐.上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式. 一.同 ...
- 多线程-4.wait() notify() notifyAll() 生产者消费者模型
1.wait()方法 该方法继承于Object类.在调用obj.wait()方法后,当前线程会失去obj的锁.待其他线程调用obj.notify()或notifyAll()方法后进入锁等待池,争抢到锁 ...
- 转: 【Java并发编程】之十三:生产者—消费者模型(含代码)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17249321 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一 ...
- 【Java并发编程】之十三:生产者—消费者模型
生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据. 这里实现如下情况的生产--消费模型: 生产者不断交替地生产两组 ...
- (三)(2)wait/notify实现生产者-消费者模型,join方法
生产者,消费者模型 举个例子来说明,厨师,服务员,厨师做菜,服务员上菜,如果厨师没有做好菜,那么服务员就无法上菜,厨师做好了菜,然后通知服务员消费(上菜).在这个过程之中,厨师扮演的就是生产者,服务员 ...
- java多线程15 :wait()和notify() 的生产者/消费者模式
什么是生产者/消费者模型 一种重要的模型,基于等待/通知机制.生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点: ...
- Java多线程14:生产者/消费者模型
什么是生产者/消费者模型 一种重要的模型,基于等待/通知机制.生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点: ...
- 如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例
wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视.本文对这些关键字的使用进行了描述. 在 Java 中可以用 wait ...
- Java 多线程详解(四)------生产者和消费者
Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多线程详解(二)------如何创建进程和线程: ...
随机推荐
- android中SharedPreferences 读取不到数据的问题
在两个不同的 Activity中,A中SharedPreferences保存了数据,在A中可以读取到,但是在 B中却读取不到了,一直是空值,好是不爽,由于是按照书本上的例子写的, 怎么也找不到原因,后 ...
- C++: I/O流详解(三)——串流
一.串流 串流类是 ios 中的派生类 C++的串流对象可以连接string对象或字符串 串流提取数据时对字符串按变量类型解释:插入数据时把类型 数据转换成字符串 串流I/O具有格式化功能 例: #i ...
- Locust学习总结分享
简介: Locust是一个用于可扩展的,分布式的,性能测试的,开源的,用Python编写框架/工具,它非常容易使用,也非常好学.它的主要思想就是模拟一群用户将访问你的网站.每个用户的行为由你编写的py ...
- 为所有的Ul下的li标签添加点击事件
- Mole and Abandoned Mine
Mole and Abandoned Mine n点m条边的无向图,删除第i条边花费c[i],问1到n只有一条路径时所需要的最小花费? \(2\le n\le 15\) . 我又A掉了一道zzs的题啦 ...
- 树的遍历顺序 - dfs序|欧拉序|dfn序(备忘)
(仅作备忘) dfs序是dfs过程中对于某节点进入这个节点的子树和离开子树的顺序 满足每个节点都会在dfs序上出现恰好两次 任意子树的dfs序都是连续的 欧拉序是dfs过程中经过节点的顺序 每个节点至 ...
- J.U.C-其他组件
J.U.C-其他组件 FutureTask 介绍Callable时我们知道它可以有返回值,返回值通过Future进行封装.FutrueTask实现了RunnableFuture接口,该接口继承了R ...
- PAT天梯赛L1-020 帅到没朋友
题目链接:点击打开链接 当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友.本题就要求你找出那些帅到没有朋友的人. 输入格式: 输入第一行给出一个正整数N(<=100),是已知朋 ...
- 【学习笔记】Python 3.6模拟输入并爬取百度前10页密切相关链接
[学习笔记]Python 3.6模拟输入并爬取百度前10页密切相关链接 问题描述 通过模拟网页,实现百度搜索关键词,然后获得网页中链接的文本,与准备的文本进行比较,如果有相似之处则代表相关链接. me ...
- P2906 [USACO08OPEN]牛的街区Cow Neighborhoods
传送门 曼哈顿距离好像不好直接算,我们可以把牛的坐标转化一下以方便计算距离 (x,y) --> (x+y,x-y) 那么距离就可以表示成 $max(\left |x_1-x_2 \right ...