Java多线程使用wait和notify实现生产者消费者模型
2024-08-23 01:29:51
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();
}
}
嗨。。。明白原理就是了......
最新文章
- MVC还是MVVM?或许VMVC更适合WinForm客户端
- CSS布局经典—圣杯布局与双飞翼布局
- Cesium原理篇:3最长的一帧之地形(1)
- python 之socket 网络编程
- Java.lang.NoSuchFieldError: INSTANCE异常
- query判断值是否为空,针对前台提交数据的校验
- python学习------dictionary和set
- background: url 背景图片加时间戳不显示图片
- ASP.NET Razor——Razor 简介
- Java去除掉HTML里面所有标签的两种方法——开源jar包和自己写正则表达式
- POJ 3977 Subset
- linux下shell命令trap
- cached_property的使用
- 【转】无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) ubuntu 安装vim 及遇到的错误处理
- centos6.5环境安装zookeeper-3.4.5
- Kubernetes外挂配置管理—ConfigMap介绍
- 树莓派apt-get The value &#39;\stable&#39; is invalid for APT 错误
- Scrapy实战篇(一)之爬取链家网成交房源数据(上)
- uva-331-枚举-交换的方案数
- gj11 多线程、多进程和线程池编程
热门文章
- Gazebo学习随记3 图形界面的使用
- 十天入门java教程 Day02
- 【探讨】linux环境,执行重启了php后php.ini依然不生效
- How to publish a pointcloud of ros msgs in a topic from a pcd file?
- PHP里public和private的区别
- 关于cuda拷贝的速度测试
- 灾后重建 Floyd
- C++使用using namespace std报错分析与解决方案
- Mybatis学习笔记(八) —— Mybatis整合spring
- 【学习笔记】Python 3.6模拟输入并爬取百度前10页密切相关链接