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实现生产者消费者模型的更多相关文章

  1. Java多线程-同步:synchronized 和线程通信:生产者消费者模式

    大家伙周末愉快,小乐又来给大家献上技术大餐.上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式. 一.同 ...

  2. 多线程-4.wait() notify() notifyAll() 生产者消费者模型

    1.wait()方法 该方法继承于Object类.在调用obj.wait()方法后,当前线程会失去obj的锁.待其他线程调用obj.notify()或notifyAll()方法后进入锁等待池,争抢到锁 ...

  3. 转: 【Java并发编程】之十三:生产者—消费者模型(含代码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17249321 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一 ...

  4. 【Java并发编程】之十三:生产者—消费者模型

    生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据. ​ 这里实现如下情况的生产--消费模型: ​ 生产者不断交替地生产两组 ...

  5. (三)(2)wait/notify实现生产者-消费者模型,join方法

    生产者,消费者模型 举个例子来说明,厨师,服务员,厨师做菜,服务员上菜,如果厨师没有做好菜,那么服务员就无法上菜,厨师做好了菜,然后通知服务员消费(上菜).在这个过程之中,厨师扮演的就是生产者,服务员 ...

  6. java多线程15 :wait()和notify() 的生产者/消费者模式

    什么是生产者/消费者模型 一种重要的模型,基于等待/通知机制.生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点: ...

  7. Java多线程14:生产者/消费者模型

    什么是生产者/消费者模型 一种重要的模型,基于等待/通知机制.生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点: ...

  8. 如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

    wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视.本文对这些关键字的使用进行了描述. 在 Java 中可以用 wait ...

  9. Java 多线程详解(四)------生产者和消费者

    Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多线程详解(二)------如何创建进程和线程: ...

随机推荐

  1. c# 制作悬浮框

    一,制作winform 窗体 窗体要做小一点,你见过500*500的悬浮框吗? 二,去掉边框和标题栏 this.FormBorderStyle = FormBorderStyle.None; 运行出来 ...

  2. C#使用Newtonsoft.Json操作json

    1.下载 Newtonsoft.Json 右键引用,选择 管理NuGet程序包,选择浏览,输入log4net,然后点击下载 2.json数据的组装与解析 public class Class { pu ...

  3. 转载 NoSQL | Redis、Memcache、MongoDB特点、区别以及应用场景

    NoSQL | Redis.Memcache.MongoDB特点.区别以及应用场景 2017-12-12 康哥 码神联盟 本篇文章主要介绍Nosql的一些东西,以及Nosql中比较火的三个数据库Red ...

  4. maven+selenium+java+testng+jenkins自动化测试

    最近在公司搭建了一套基于maven+selenium+java+testng+jenkins的自动化测试框架,免得以后重写记录下 工程目录 pom.xml <project xmlns=&quo ...

  5. 「十二省联考 2019」皮配——dp

    题目 [题目描述] #### 题目背景一年一度的综艺节目<中国好码农>又开始了.本季度,好码农由 Yazid.Zayid.小 R.大 R 四位梦想导师坐镇,他们都将组建自己的梦想战队,并率 ...

  6. (Python OpenGL)【4】Uniform变量 PyOpenGL

    (Python OpenGL) 原文:http://ogldev.atspace.co.uk/www/tutorial05/tutorial05.html(英文) __author__ = " ...

  7. kuangbin专题十六 KMP&&扩展KMP POJ2752 Seek the Name, Seek the Fame

    The little cat is so famous, that many couples tramp over hill and dale to Byteland, and asked the l ...

  8. vue.js组件之j间的通讯三,通过单一事件来管理组件通讯

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  9. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_IL和验证

    1.IL 基于栈——所有指令压入一个执行栈,并从栈弹出结果. 2.IL 指令无类型——指令会判断栈中操作数的类型,并执行恰当的操作. 3.IL 最大优势——应用程序的健壮性和安全性. 将 IL 编译成 ...

  10. POJ 3659 Cell Phone Network 最小支配集模板题(树形dp)

    题意:有以个 有 N 个节点的树形地图,问在这些顶点上最少建多少个电话杆,可以使得所有顶点被覆盖到,一个节点如果建立了电话杆,那么和它直接相连的顶点也会被覆盖到. 分析:用最少的点覆盖所有的点,即为求 ...