数据

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. Oracle NVL空值处理函数

    --NVL空值处理函数 --需求:显示价格表中业主类型ID为1的价格记录 如果上限值为null,则显示9999999 ) from dual; select * from t_pricetable ) ...

  2. AngularJS路由使用案例

    AngularJS路由使用案例: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"& ...

  3. laravel 循环中子元素使用&符号嵌入到父级,经典版

    /**ajax 获取企业名称 * * @param Request $request * * @return \Illuminate\Http\JsonResponse * @author lxw * ...

  4. QueryRunner 错误

    QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource()); 写成了 QueryRunner qr = new QueryRunner(); 导 ...

  5. mybatis插入数据并返回自增Id

    上图mybatis的写法,在xxxMapper.xml中: 加入:useGeneratedKeys="true" keyProperty="applyId" k ...

  6. Oracle 中sql文件的导入导出

    导出 一般导入的时候我用的是命令行 imp c##zs/@orcl fromuser=c##zs touser=c##zs file=D:\java\.dmp ignore=y c##zs 是创建的用 ...

  7. eclipse 部署项目

  8. git连接到github

    基本流程如图 如何配置SSH key:在gitBash里执行. 1.检查电脑上是否生成过了,如果已经生成了,则需要删除后再操作 cd ~ cd .ssh 提示:No such file or dire ...

  9. 用junit对java代码进行测试,需要注意

    1.用@Test注解的方法必须没有返回值,返回值类型无:void 2.用@Test注解的方法必须没有参数.

  10. GitHub创建仓库,并与git本地仓库关联

    登录后头像右上角点击: 起名再create 后 会跳转到下面页面: 先在git上复制执行第一条指令,创建一个readme文档 然后再用第二条初始化仓库 第三步将readme文档添加至暂存区 然后提交一 ...