设计模式-生产者消费者模式
来源:互联网 发布:淘宝怎么看几颗心 编辑:程序博客网 时间:2024/05/22 13:14
设计模式-生产者消费者模式(java)
生产者消费者模式:
生成者消费者模式是指通过俩个不同的任务线程完成其相应的功能,二者公用一个公有队列,生产者进行产品的生成,而消费者负责消耗产品,当生产的产品大于公有队列的大小的时候,对生产者进行阻塞,当消费者消耗了以后,队列有了空间的时候,生产者在进行生产。这样一直循环的生产,消费的模型叫做生产者与消费者模式(个人理解)
(以下代码使用Kotlin编写)
package com.design.patternsimport java.util.concurrent.ExecutorServiceimport java.util.concurrent.Executorsimport java.util.concurrent.LinkedBlockingQueue/** * Created by chenpengfei on 17/8/30. */object Producerconsumer{ @JvmStatic fun main(args:Array<String>){ //创建一个线程池对象来调度生产者与消费者线程 var service: ExecutorService? = Executors.newCachedThreadPool() //创建用来存放产品的队列对象 var storage: Storage ?= Storage() //创建生产者线程 var producter : Producter ? = Producter("陈", storage!!) //创建消费者线程 var comsumer1 = Consumer("李", storage!!); //添加线程任务到线程池中进行调度 service!!.submit(producter) service!!.submit(comsumer1) } //消费者线程 class Consumer:Runnable{ var name:String? = null var storage:Storage? = null constructor(name: String ,storage:Storage){ this.name = name this.storage = storage } override fun run() { while (true){ var product = storage!!.pop() System.out.println(name!! + "已经消费" + product.toString()) //让消费者线程睡眠10秒,为了验证生产者生产的产品 //超过10个以后会停止生产 Thread.sleep(10000) } } } class Producter :Runnable{ var name:String? = null var storage:Storage? = null constructor(name: String ,storage:Storage){ this.name = name this.storage = storage } override fun run() { while (true){ var product:Product = Product(this!!.name!!,System.currentTimeMillis()) System.out.println("生产"+product.toString()) storage!!.push(product) //设置睡眠500毫秒 Thread.sleep(500) } } } class Product{ var name:String? = null var id:Long ? = 0 constructor(name:String, id: Long){ this.name = name this.id= id } override fun toString(): String { return name + "," + id ; } }//产品队列 class Storage{ var queue : LinkedBlockingQueue<Product> = LinkedBlockingQueue<Product>(10) fun push(product: Product){ queue!!.put(product); } fun pop() : Product{ return queue!!.take() } }}
通过下边的代码运行结果可以发现,开始生产一个产品以后,消费者就会进行消耗,而在他的消耗过程中,生产者还一直在生产,直到
队列中元素个数 = 设置的容量+ 1 (上边代码中设置为10),
所以可以看到,会生成11个。具体原因需要看LinkedBlockingQueue源码。就不介绍了。
生产陈,1504077513951李已经消费陈,1504077513951生产陈,1504077514456生产陈,1504077514961生产陈,1504077515465生产陈,1504077515969生产陈,1504077516472生产陈,1504077516976生产陈,1504077517478生产陈,1504077517982生产陈,1504077518486生产陈,1504077518990生产陈,1504077519494李已经消费陈,1504077514456生产陈,1504077524456李已经消费陈,1504077514961生产陈,1504077534462李已经消费陈,1504077515465生产陈,1504077544462
阅读全文
0 0
- 设计模式-生产者消费者模式
- 设计模式 - 生产者-消费者模式
- 设计模式--生产者消费者模式
- 设计模式-生产者消费者模式
- 架构设计:生产者/消费者模式
- 架构设计:生产者/消费者模式
- 架构设计:生产者/消费者模式
- 架构设计:生产者/消费者模式
- 架构设计:生产者/消费者模式
- 架构设计:生产者/消费者模式
- 架构设计:生产者/消费者模式
- 架构设计:生产者/消费者模式
- 架构设计:生产者/消费者模式
- 架构设计:生产者/消费者模式
- 架构设计:生产者/消费者模式
- 架构设计:生产者/消费者模式
- Java设计模式之生产者消费者模式
- 设计模式—生产者消费者模式
- [编程题] 小易记单词
- TensorFlow练习(二)——搭建神经网络结构
- http虚拟主机配置——基于端口
- 错误:声明指定了两个以上的数据类型
- javascript中的函数,闭包简单介绍
- 设计模式-生产者消费者模式
- 关于volatile
- DTO作用
- webpack--概念5--插件
- Android程序设计基础--总结
- python sets — Unordered collections of unique elements
- POJ3304 Segments(计算几何,线段和直线的交点)
- ansible之条件语句
- 根据类名来跳转对应界面