博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java多线程使用wait和notify实现生产者消费者模型
阅读量:6359 次
发布时间:2019-06-23

本文共 2551 字,大约阅读时间需要 8 分钟。

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

 

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

 

转载地址:http://hubma.baihongyu.com/

你可能感兴趣的文章
【Go】并发编程
查看>>
VMware虚拟化NSX-Manager命令行更改admin用户密码
查看>>
python字符串函数
查看>>
ORM框架Hibernate (四)MyEclipse Hibernate Tool 逆向生成实体类
查看>>
去掉iphone连接电脑时会出现的弹出窗口
查看>>
【python】-- web开发之HTML
查看>>
vs2015 去除 git 源代码 绑定
查看>>
解决firefox的button按钮文字不能垂直居中
查看>>
网络协议端口号详解
查看>>
大话数据结构读后感——第一章
查看>>
各种排序
查看>>
ts 格式化日期输出
查看>>
Optional
查看>>
sed 命令编辑文本
查看>>
Activity调用isDestroyed()方法报出,java.lang.NoSuchMethodError
查看>>
使用AFNetworking第三方下载类
查看>>
fhq-treap小结
查看>>
about porting
查看>>
MySQL事务及ACID特性
查看>>
Hadoop_31_MapReduce参数优化
查看>>