java多生产者消费者
来源:互联网 发布:淘宝现在是什么模式 编辑:程序博客网 时间:2024/05/22 11:36
想想很容易,写起来却并不是很顺...磕磕巴巴写好久有木有。补充回顾不少基础知识。
参考:
一个生产者和一个消费者的情形。使用synchronized ,wait,notify。由于对于任何一方来说上锁的一定是对方,最后notify没什么问题。但多个消费者会出错。
一生产者多消费者,不过这个问题的情景生产者的情形有点微妙(等消费完了再生产这点)。
多个生产者多个消费者一种的解决方案。(concurrent的lock,Condition,await,signal)
进阶的多生产多消费者解决方案。/** * 生产者 * * @author zoe * */class Productor implements Runnable {ProductBuffer buf;String name = "Productor";Productor(ProductBuffer buf, String name) {this.buf = buf;this.name = name;}public Product product() {Product p = new Product();System.out.println(this.name + "正在生产" + p.thisnum + "号...");try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}return p;}public void run() {while (true) {Product p = product();try {buf.add(p);} catch (Exception e) {e.printStackTrace();}}}}
/** * 消费者 * * @author zoe * */class Consumer implements Runnable {ProductBuffer buf;String name = "Consumer";Consumer(ProductBuffer buf, String name) {this.buf = buf;this.name = name;}public void consume(Product p) {System.out.println(this.name + "正在消费" + p.thisnum + "号...");try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}public void run() {while (true) {try {Product p = buf.remove();consume(p);Thread.sleep(new Random().nextInt(1000));} catch (Exception e) {e.printStackTrace();}}}}
/** * 产品 * * @author zoe * */class Product {static int num;int thisnum = num;Product() {num++;}}/** * 产品缓冲队列 * * @author zoe * */class ProductBuffer {List<Product> buf = new ArrayList<Product>();static final int MAX = 10;// 多生产者消费者关键Lock l = new ReentrantLock();Condition empty = l.newCondition(); // 消费者的“空”位锁Condition full = l.newCondition(); // 生产者的“满”位锁synchronized boolean isFull() {return buf.size() == MAX;}void add(Product p) throws Exception {l.lock();if (buf.size() == MAX) {full.await();}buf.add(p);System.out.println("新生产了一个!buf现有:" + buf.size() + "个\n---------");empty.signal();l.unlock();}Product remove() throws Exception {l.lock();if (buf.size() == 0) {empty.await();}Product p = buf.remove(buf.size() - 1);System.out.println("刚消费了一个!buf现有:" + buf.size() + "个\n---------");full.signal();l.unlock();return p;}
运行测试类
public class PAC {public static void main(String[] args) throws Exception {ProductBuffer buf = new ProductBuffer();Productor p1 = new Productor(buf, "生产者a");Productor p2 = new Productor(buf, "生产者b");Productor p3 = new Productor(buf, "生产者c");Consumer c = new Consumer(buf, "消费者1");Consumer c2 = new Consumer(buf, "消费者2");new Thread(p1).start();new Thread(p2).start();new Thread(p3).start();new Thread(c).start();new Thread(c2).start();}}
0 0
- java多生产者消费者
- 多生产者和多消费者---Java程序
- java-多线程 多对多 生产者消费者
- Java——多生产者 多消费者
- 多消费者,多生产者模式Java实现
- java多生产者,单消费者实现
- java中的多生产者-消费者问题学习
- java多线程 消费者-生产者
- java生产者 消费者问题
- java生产者消费者
- java生产者消费者
- Java生产者消费者问题
- java多线程 消费者-生产者
- java生产者消费者问题
- java 多线程 生产者消费者
- JAVA [ 多线程 -- 生产者消费者 ]
- Java 生产者消费者问题
- java 生产者消费者问题
- 面向程序员的数据库访问性能优化法则
- setCompoundDrawables与setCompoundDrawablesWithIntrinsicBounds的区别
- 获得字典表中相应的数据(静态方法)
- MYSQL 日期函数大全
- Drupal 7 建站学习手记(一):PHP输出的页面多出空行的问题
- java多生产者消费者
- oracle利用游标 往表中批量插入数据
- spring mvc例子
- Hello World
- 配置apache+php+mysql
- 【PB】从数据窗口获得数据的方法总结
- 磁盘分区表备份与恢复
- c++学习笔记之类模板中的友元声明
- http协议