数据

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中返回Json数据的处理方法(转)

    Json 作为一种数据交换格式在网络开发,特别是 Ajax 与 Restful 架构中应用的越来越广泛.而 Apache 的 JMeter 也是较受欢迎的压力测试工具之一,但是它本身没有提供对于 Js ...

  2. Linux中各个目录作用

    对于linux新手来说,最感到迷惑的问题之一就是文件都存在哪里呢?特别是对于那些从windows转过来的新手来说,linux的目录结构看起来有些奇怪哦.比如没有C盘,没有分盘符,一大堆不知道用途的文件 ...

  3. [转帖]K8H3D 病毒 腾讯御剑的解析

    https://weibo.com/ttarticle/p/show?id=2309404344350225132710 永恒之蓝下载器木马又双叒叕升级了新的攻击方式​​ 背景 腾讯安全御见威胁情报中 ...

  4. vue页面传参和接参

    https://blog.csdn.net/zhouzuoluo/article/details/81259298(copy) js** this.$router.push({ name: 'Flow ...

  5. 关于 flask 实现数据库迁移以后 如何根据创建的模型类添加新的表?

    在此之前 我们先说一下常规的flask运用第三方扩展来实现数据库的迁移的三个步骤以及每步的目的. 数据库的迁移的三个步骤:(cd 到run.py所在路径) python run.py db init ...

  6. replace只能输入小数

    case "checkPrice": tr.find(".layui-table-edit").keyup(function () { var $input = ...

  7. 【python练习题】程序15

    #题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. n = input('请输入成绩 :') n = int(n) if ...

  8. 灰度图Matlab

    [转载]matlab中pcolor绘图“少画一行”的问题 本文是关于matlab pcolor函数(slice,surf函数的情况与这个类似)绘图的问题的一些解决方案,在此记录备用 经 常处理三维(或 ...

  9. CF 1041 1042整理

    终于回来整理了,这两场比赛我也是醉了,第一场-1分,第二场被skip,还是太菜啊qaq CF1041 T1T2过水忽略直接看后面 T3大意:给你一个长度为n的序列a1,a2,a3···an,你需要把这 ...

  10. Nginx stream如何获取ssl信息并反向代理至上游服务器

    L:116