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();
}
}

嗨。。。明白原理就是了......

最新文章

  1. MVC还是MVVM?或许VMVC更适合WinForm客户端
  2. CSS布局经典—圣杯布局与双飞翼布局
  3. Cesium原理篇:3最长的一帧之地形(1)
  4. python 之socket 网络编程
  5. Java.lang.NoSuchFieldError: INSTANCE异常
  6. query判断值是否为空,针对前台提交数据的校验
  7. python学习------dictionary和set
  8. background: url 背景图片加时间戳不显示图片
  9. ASP.NET Razor——Razor 简介
  10. Java去除掉HTML里面所有标签的两种方法——开源jar包和自己写正则表达式
  11. POJ 3977 Subset
  12. linux下shell命令trap
  13. cached_property的使用
  14. 【转】无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) ubuntu 安装vim 及遇到的错误处理
  15. centos6.5环境安装zookeeper-3.4.5
  16. Kubernetes外挂配置管理—ConfigMap介绍
  17. 树莓派apt-get The value &#39;\stable&#39; is invalid for APT 错误
  18. Scrapy实战篇(一)之爬取链家网成交房源数据(上)
  19. uva-331-枚举-交换的方案数
  20. gj11 多线程、多进程和线程池编程

热门文章

  1. Gazebo学习随记3 图形界面的使用
  2. 十天入门java教程 Day02
  3. 【探讨】linux环境,执行重启了php后php.ini依然不生效
  4. How to publish a pointcloud of ros msgs in a topic from a pcd file?
  5. PHP里public和private的区别
  6. 关于cuda拷贝的速度测试
  7. 灾后重建 Floyd
  8. C++使用using namespace std报错分析与解决方案
  9. Mybatis学习笔记(八) —— Mybatis整合spring
  10. 【学习笔记】Python 3.6模拟输入并爬取百度前10页密切相关链接