数据

package cn.lonecloud.procum;

/**
* @author lonecloud
* @version v1.0
* @date 上午11:00 2018/5/7
*/
public class Data { private String data; public String getData() {
return data;
} public void setData(String data) {
this.data = data;
}
}

  

生产者

package cn.lonecloud.procum;

import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger; /**
* @author lonecloud
* @version v1.0
* @date 上午10:58 2018/5/7
*/
public class Provider implements Runnable {
  
private BlockingQueue<Data> queue; private static AtomicInteger integer = new AtomicInteger(0); public Provider(BlockingQueue<Data> queue) {
this.queue = queue;
} Random random = new Random(); @Override
public void run() {
while (true) {
int i = random.nextInt(1000);
try {
          //模拟数据耗时
Thread.sleep(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
Data data = new Data();
data.setData(String.valueOf(integer.getAndIncrement()));
try {
if (!queue.offer(data, 20, TimeUnit.SECONDS)) {
System.out.println("offer error");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

 消费者

package cn.lonecloud.procum;

import java.util.Objects;
import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit; /**
* @author lonecloud
* @version v1.0
* @date 上午10:58 2018/5/7
*/
public class Customer implements Runnable {
private BlockingQueue<Data> queue; public Customer(BlockingQueue<Data> queue) {
this.queue = queue;
} Random random = new Random(); @Override
public void run() {
while (true) {
try {
Data data = queue.take();
System.out.println("---------"+data.getData());
} catch (InterruptedException e) {
e.printStackTrace();
}
int i = random.nextInt(1000);
try {
Thread.sleep(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

 主函数

package cn.lonecloud.procum;

import cn.lonecloud.thread.factory.TraceThreadPool;

import java.util.concurrent.*;

/**
* @author lonecloud
* @version v1.0
* @date 上午11:06 2018/5/7
*/
public class Main {
public static void main(String[] args) {
BlockingQueue queue = new ArrayBlockingQueue(10);
// ThreadPoolExecutor poolExecutor=new TraceThreadPool(5,5,20, TimeUnit.SECONDS,new ArrayBlockingQueue<>(10));
ExecutorService poolExecutor=Executors.newFixedThreadPool(5);
for (int i = 0; i < 3; i++) {
Customer customer = new Customer(queue);
poolExecutor.submit(customer);
}
for (int i = 0; i < 5; i++) {
Provider provider = new Provider(queue);
poolExecutor.submit(provider);
}
}
}

  

使用BlockQueue实现生产者和消费者模式的更多相关文章

  1. 使用libuv实现生产者和消费者模式

    生产者和消费者模式(Consumer + Producer model) 用于把耗时操作(生产线程),分配给一个或者多个额外线程执行(消费线程),从而提高生产线程的响应速度(并发能力) 定义 type ...

  2. java生产者与消费者模式

    前言: 生产者和消费者模式是我们在学习多线程中很经典的一个模式,它主要分为生产者和消费者,分别是两个线程, 目录 一:生产者和消费者模式简介 二:生产者和消费者模式的实现 声明:本例来源于java经典 ...

  3. condition版生产者与消费者模式

    1.简介 在爬虫中,生产者与消费者模式是经常用到的.我能想到的比较好的办法是使用redis或者mongodb数据库构造生产者消费者模型.如果直接起线程进行构造生产者消费者模型,线程容易假死,也难以构造 ...

  4. Java并发编程(4)--生产者与消费者模式介绍

    一.前言 这种模式在生活是最常见的,那么它的场景是什么样的呢? 下面是我假象的,假设有一个仓库,仓库有一个生产者和一个消费者,消费者过来消费的时候会检测仓库中是否有库存,如果没有了则等待生产,如果有就 ...

  5. Java多线程设计模式(2)生产者与消费者模式

    1 Producer-Consumer Pattern Producer-Consumer Pattern主要就是在生产者与消费者之间建立一个“桥梁参与者”,用来解决生产者线程与消费者线程之间速度的不 ...

  6. 【爬虫】Condition版的生产者和消费者模式

    Condition版的生产者和消费者模式 threading.Condition 在没有数据的时候处于阻塞状态,有数据可以使用notify的函数通知等等待状态的线程运作 threading.Condi ...

  7. 【爬虫】Load版的生产者和消费者模式

    ''' Lock版的生产者和消费者模式 ''' import threading import random import time gMoney = 1000 # 原始金额 gLoad = thre ...

  8. java 线程并发(生产者、消费者模式)

    线程并发协作(生产者/消费者模式) 多线程环境下,我们经常需要多个线程的并发和协作.这个时候,就需要了解一个重要的多线程并发协作模型“生产者/消费者模式”. Ø 什么是生产者? 生产者指的是负责生产数 ...

  9. java进阶(40)--wait与notify(生产者与消费者模式)

    文档目录: 一.概念 二.wait的作用 三.notify的作用 四.生产者消费者模式 五.举例 ---------------------------------------分割线:正文------ ...

随机推荐

  1. JMeter学习non-gui模式运行

    -h, --help print usage information and exit #打印帮助信息 -v, --version print the version information and ...

  2. js获取非行间样式/写入样式(行间)

    <!--DOCTYPE html--> <html> <head> <meta charset="utf-8" /> <sty ...

  3. python之路--内置常用模块

    一 . 简单的了解模块 你写的每一个py文件都是一个模块. 还有一些我们一直在使用的模块. buildins  内置模块. print, input. random  主要是和随机相关的的内容 ran ...

  4. mysql “Too many connections” 解决办法

    今天生产服务器上的MySQL出现了一个不算太陌生的错误“Too many connections”.平常碰到这个问题,我基本上是修改/etc/my.cnf的max_connections参数,然后重启 ...

  5. Monkey脚本API简介

    一.API简介 LaunchActivity(pkg_name, cl_name):启动应用的Activity.参数:包名和启动的Activity. Tap(x, y, tapDuration): 模 ...

  6. Hibernate 配置文件hibernate.cfg.xml的详细

    <!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式-->               <?xml ...

  7. canvas图形绘制

    前面的话 前面分别介绍了canvas的基础用法和进阶用法,本文将使用canvas的各种语法进行图形绘制 绘制线条 [绘制线条] 下面来尝试绘制一段线条 <canvas id="draw ...

  8. draknet网络配置参数

    https://blog.csdn.net/hrsstudy/article/details/65447947?utm_source=itdadao&utm_medium=referral [ ...

  9. No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK问题解决

    Maven构建项目报错: 解决办法: 1.eclipse菜单 -  Window - Preferences- Java - Installed JREs 将配置的JRE定位到JDK,例如JRE ho ...

  10. Qt QLabel的使用

    QLabel类主要用来文本和图像的显示,没有提供用户交互功能.QLabel对象的视觉外观可以由用户自定义配置. 它还可以为另外一个可获得焦点的控件作为焦点助力器. QLabel可以显示下列的所有类型: ...