生产者-消费者

生产者消费者模式是一个非常经典的多线程模式,比如我们用到的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. php中正则表达式详解

    概述 正则表达式是一种描述字符串结果的语法规则,是一个特定的格式化模式,可以匹配.替换.截取匹配的字符串.常用的语言基本上都有正则表达式,如JavaScript.java等.其实,只有了解一种语言的正 ...

  2. mysql 计算两点经纬度之间的距离含具体sql语句

    mysql距离计算,单位m,以及排序 lon 经度 lat 纬度 一般地图上显示的坐标顺序为,纬度在前(范围-90~90),经度在后(范围-180~180) 首先新建一张表,里面包含经纬度 SET F ...

  3. nginx支持ipv6

    今天碰到的问题是nginx对于ipv6的请求没有日志,顺便查了一下,nginx对ipv6的支持. nginx -v查看nginx是否支持ipv6,出现--with-ipv6,则是支持nginx的,否则 ...

  4. python:函数初始

    一.函数 1.函数初始:函数就是封装一个功能 2.函数名,函数体,关键字,函数的返回值 def 关键字,定义一个函数 my_len 函数名书写规则和变量一样 def 与函数名中间一个空格 函数名(): ...

  5. python-单元测试优化,加入日志

    HttpRequests.py #-*- coding:utf-8 -*- import requests class HttpRequests(): def http_requests(self,u ...

  6. 阿里云视频直播PHP-SDK

    阿里云 视频直播 配置 及 PHP-SDK 接入教程准备工作域名管理配置鉴权地址生成器及DEMO演示-熟悉鉴权接入SDK推流回调的配置阿里云 视频直播 配置 及 PHP-SDK 接入教程 个人感觉,阿 ...

  7. iphone 开发h5 踩过的坑

    html,body{ -webkit-text-size-adjust: none; }  // 当需要在中文版chrome浏览器中显示小于12px的字体时,而且此时页面放大效果会被阻止 html,b ...

  8. Adjacent Bit Counts(01组合数)

    Adjacent Bit Counts 4557 Adjacent Bit CountsFor a string of n bits x 1 , x 2 , x 3 ,..., x n , the a ...

  9. laravel不能读取session

    Laravel用redis存储session,论坛有讨论说关于session无法保存的问题:https://laravel-china.org/topics/13510/points-to-be-pa ...

  10. SpringMVC处理XML格式的数据

    1.搭建SpringMVC+spring环境 2.web.xml,Springmvc-config.xml.springMVC提供了处理xml格式请求响应的HttpMessageConverter,s ...