生产者-消费者

生产者消费者模式是一个非常经典的多线程模式,比如我们用到的Mq就是其中一种具体实现

在该模式中 通常会有2类线程,消费者线程和生产者线程

生产者提交用户请求 消费者负责处理生产者提交的任务,在消费者和生产者之间共享内存缓存区进行通信

常见的实现 可以 通过 wait/notifyAll来  或者 阻塞队列来实现 下面我来演示下通过 wait/notifyAll 来实现。。。

下面是代码演示

public class Storage<T> {
LinkedList<T> list = new LinkedList<>();
private Integer maxSize; public Integer getMaxSize() {
return maxSize;
} public void setMaxSize(Integer maxSize) {
this.maxSize = maxSize;
} public T consumer() {
synchronized (list) {
if (list == null || list.size() == 0) {
try {
System.out.println(Thread.currentThread().getName() + " 等待 ");
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
T t = list.remove();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " 消费 " + t);
if (list.size() == 0) { // 消费完了 通知生产者 继续生产
list.notifyAll();
}
return t;
}
}
return null;
} public void producer(T t) {
synchronized (list) {
if (list.size() == maxSize.intValue()) {
System.out.println(Thread.currentThread().getName() + " 仓库已满 暂停生产 ");
try {
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
list.add(t);
System.out.println(Thread.currentThread().getName() + " 生产 " + t); list.notifyAll();
} }
} public static void main(String[] args) {
Storage<Integer> storage = new Storage<>();
storage.setMaxSize(5);
AtomicInteger numberGenarnate = new AtomicInteger(0); ExecutorService consumerService = Executors.newCachedThreadPool();
for (int i = 0; i < 3; i++) {
Runnable run = new Runnable() { @Override
public void run() {
while (true) {
storage.consumer();
}
}
};
consumerService.submit(run);
} for (int i = 0; i < 1; i++) {
Runnable run = new Runnable() { @Override
public void run() {
while (true) {
storage.producer(numberGenarnate.incrementAndGet());
}
}
};
consumerService.submit(run);
} consumerService.shutdown();
}
}

运行结果如下

 总结:对于消费者生产者模式 要理解其思想。实际开发中。mq(消息队列)就是典型的应用。

对于mq这里多说几句,关于技术选型:::

Mq适用于生产者生产很多   消费者处理不过来的情况 。如果消费者处理能力很强,就不要用mq了,直接使用nio框架(mina   or  netty

java多线程系列15 设计模式 生产者 - 消费者模式的更多相关文章

  1. Java多线程—阻塞队列和生产者-消费者模式

    阻塞队列支持生产者-消费者这种设计模式.该模式将“找出需要完成的工作”与“执行工作”这两个过程分离开来,并把工作项放入一个“待完成“列表中以便在随后处理,而不是找出后立即处理.生产者-消费者模式能简化 ...

  2. Java设计模式—生产者消费者模式(阻塞队列实现)

    生产者消费者模式是并发.多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据.这篇文章我们来看看什么是生产者消费者模式,这个问 ...

  3. Java 多线程学习笔记:生产者消费者问题

    前言:最近在学习Java多线程,看到ImportNew网上有网友翻译的一篇文章<阻塞队列实现生产者消费者模式>.在文中,使用的是Java的concurrent包中的阻塞队列来实现.在看完后 ...

  4. Java多线程之并发协作生产者消费者设计模式

    两个线程一个生产者个一个消费者 需求情景 两个线程,一个负责生产,一个负责消费,生产者生产一个,消费者消费一个 涉及问题 同步问题:如何保证同一资源被多个线程并发访问时的完整性.常用的同步方法是采用标 ...

  5. java多线程系列13 设计模式 Future 模式

    Future 模式 类似于ajax请求  页面异步的进行后台请求 用户无需等待请求的结果 就可以继续浏览或者操作 核心就是:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑 ...

  6. Java笔记1 : 在生产者消费者模式中,线程通信与共享数据,死锁问题与解决办法

    本例定义了4个类,这里说一下,方便下面讲解.分别是Product(产品),Producer(生产者),Consumer(消费者), Test(测试类). 多线程之间通信与共享数据只要引用同一内存区域就 ...

  7. java多线程系列14 设计模式 Master-Worker

    Master-Worker模式是常用的并行设计模式,可以将大任务划分为小任务,是一种分而治之的设计理念. 系统由两个角色组成,Master和Worker,Master负责接收和分配任务,Worker负 ...

  8. java多线程系列 目录

    Java多线程系列1 线程创建以及状态切换    Java多线程系列2 线程常见方法介绍    Java多线程系列3 synchronized 关键词    Java多线程系列4 线程交互(wait和 ...

  9. 使用Lock锁生产者消费者模式

    package com.java.concurrent; import java.util.concurrent.locks.Condition; import java.util.concurren ...

随机推荐

  1. 记录一下我在lubuntu里面用到的工具

    文本编辑:Atom 文本对比:Beyond Compare 数据库工具:dbeaver Git工具:GitKraKen SVN工具:RapidSVN 网页编程工具:WebStorm 另外,14.04版 ...

  2. ylbtech-协议-网络-安全协议:HTTPS

    ylbtech-协议-网络-安全协议:HTTPS HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext ...

  3. 读书笔记——《redis入门指南(第2版)》第三章 入门

    3 .redis的5种数据类型及相应命令 redis不区分命令大小写. string 512m 一个散列类型键可包含至多232-1个字段 一个列表类型键最多能容纳232-1个元素 一个集合类型键最多能 ...

  4. 第17课 类型萃取(1)_基本的type_traits

    1. type_traits类型萃取 (1)type_traits通过定义一些结构体或类,并利用模板类特化和偏特化的能力,给类型赋予一些特性,这些特性根据类型的不同而异.在程序设计中可以使用这些tra ...

  5. java 错误

    ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2 解决在程序最后加一条语句system. ...

  6. win7 64 位 + vs2015 + opencv3.2

    下载OpenCv_3.2_vc14 链接:http://pan.baidu.com/s/1eSBu1NG 密码:104g 1.下载好后,进行解压到自己指定的目录: 解压后可以得到: 2.添加环境变量 ...

  7. ORA-20011 问题处理

    今天巡检发现alert中报如下错: ORA-20011: Approximate NDV failed: ORA-29913: error in executing ODCIEXTTABLEOPEN ...

  8. Mac 系统下 mysql 的安装与配置

    1.mysql 的安装 1)官网下载 mysql 安装包:http://www.mysql.com/downloads/ 2)下载后解压打开安装包,点击 pkg 文件进行安装 3)注意:最后一步弹窗会 ...

  9. ExecutorService——shutdown方法和awaitTermination方法

    ExecutorService的关闭shutdown和awaitTermination为接口ExecutorService定义的两个方法,一般情况配合使用来关闭线程池. 方法简介shutdown方法: ...

  10. Eclipse中创建一个新的SpringBoot项目

    在Eclipse中创建一个新的spring Boot项目: 1. 首先在Eclipse中安装STS插件:在Eclipse主窗口中点击 Help -> Eclipse Marketplace... ...