生产消费者模型实现
2016-04-20 11:47
309 查看
第一次接触生产消费者问题是在操作系统课上,当时是用的信号量来解决这个问题,为了实现互斥搞得挺麻烦。今天用Java多线程来实现就简单多了。
在这个类里就进行实现对存储区域操作的互斥,用了synchronized关键字和wait,notify等函数。
生产者线程执行入库操作:
以上没什么解释的,注意生产者比消费者快。
声明了各两个对象线程,仓库容量为3:
执行结果:
看起来消费者是比生产者要慢一些,所以难得看到空。
1.存储类
用于存放生产的东西的类。public class Store { private int MAX_NUM = 0;//仓库最大容量 private int count = 0;//仓库现有容量 public Store(int num){ this.MAX_NUM = num; } synchronized public void add(){ while(count>=MAX_NUM){ System.out.println("It's full.\n"); try { this.wait();//进入等待池 } catch (InterruptedException e) { e.printStackTrace(); } } count++; System.out.println(Thread.currentThread().getName()+" count = "+count); this.notifyAll();//通知所有消费者线程,将它们从线程池唤醒 } synchronized public void remove(){ while(count<=0){ System.out.println("It's Empty.\n"); try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } count--; System.out.println(Thread.currentThread().getName()+" count = "+count); this.notify();//唤醒某一个生产者线程 } }
在这个类里就进行实现对存储区域操作的互斥,用了synchronized关键字和wait,notify等函数。
2.消费者和生产者线程实现
消费者线程执行出库操作:public class Consumer extends Thread{ Store s; public Consumer(Store s) { this.s = s; } @Override public void run() { while(true){ s.remove(); try { Thread.sleep(1500);//为了看得更清楚 } catch (InterruptedException e) { e.printStackTrace(); } } } }
生产者线程执行入库操作:
public class Producer extends Thread{ Store s; public Producer(Store s) { this.s = s; } @Override public void run() { while(true){ s.add(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
以上没什么解释的,注意生产者比消费者快。
3.实现这个场景
在Main方法中:声明了各两个对象线程,仓库容量为3:
public static void main(String[] args) { Store s = new Store(3); Producer p1 = new Producer(s); Producer p2 = new Producer(s); Consumer c1 = new Consumer(s); Consumer c2 = new Consumer(s); p1.setName("p1"); p2.setName("p2"); c1.setName("c1"); c2.setName("c2"); p1.start(); p2.start(); c1.start(); c2.start(); }
执行结果:
看起来消费者是比生产者要慢一些,所以难得看到空。
相关文章推荐
- 矩形覆盖
- java水平还是提高得很慢的原因是什么
- (Java实现) HDOJ 2037 今年暑假不AC 经典贪心
- 算法Sedgewick第四版-第1章基础-023-MultiwordSearch.java
- !!2016/4/20——一次重大的操作失误!一个经典的被套过程
- ASP.NET 中 Button、LinkButton和ImageButton 三种控件的使用详解
- UIWebView的使用---嵌入html后对其部分删除或修改 实现自定义
- WdatePicker 日期控件- 功能及示例
- C#-using用法详解
- poj 3304 Segments(线段与直线相交)
- nfs
- hadoop streaming部分问题总结
- 设置本地时间_简单版
- java 序列化
- 关于APP中UIImagePickerController中文字本地化
- r语言 画图 参数
- Java的很多方面都比较了解了
- 牛腩新闻公布系统总结(三)----点滴知识
- linux下无法删除文件的原因
- 微信开发测试号配置