多线程接收数据并缓存到BlockingQueue,然后多线程消费缓存数据
来源:互联网 发布:三国志群英会java 编辑:程序博客网 时间:2024/06/05 05:22
多线程接收数据并缓存到BlockingQueue,然后多线程消费缓存数据
这个例子如果稍微改造,可以实现按照数据类型区分缓存
请大家看看, 有没有什么问题, 请指出,谢谢 。
package com.ygd.learn.threadTest.lock1.dtc;import java.text.MessageFormat;import java.util.concurrent.*;/** * Description * 模拟一个接口多线程接收数据,然后缓存到blockingQueue中, 然后多线程消费缓存在blockingQueue中的数据 * 其中每个线程处理一个缓存的blockingQueue的数据, 也就是blockingQuere的数量和线程的接收/消费的线程数相同 * Created by ygd on 2017/9/1. */public class DtcTest { ConcurrentMap<Integer,ArrayBlockingQueue<String>> concurrentMap = new ConcurrentHashMap<Integer,ArrayBlockingQueue<String>>();// 全局的。用来存放缓存数据的blockingQueue private final int blockQueueCount = 20 ;// blockQueue的数量,设计的是一个线程一个blockQueue ,来存放接收的数据 private final int blockQuerySize = 200 ;// 每个blockQueue的大小 public static void main(String[] args) { DtcTest dtcTest = new DtcTest(); ReceiveDataCache receiveDataCache = dtcTest.new ReceiveDataCache(); receiveDataCache.execute(); SaveData saveData = dtcTest.new SaveData(); saveData.execute(); } /** * 消费blockingQueue中的数据 */ class SaveData{ public void execute(){ ExecutorService executorService = Executors.newFixedThreadPool(blockQueueCount); for(int i = 0 ;i <blockQueueCount ; i++){ ExecuteClass executeClass = new ExecuteClass(); executeClass.setBlockQueueKey(i); executorService.submit(executeClass); } } class ExecuteClass implements Callable<String>{ private int blockQueueKey ; @Override public String call() throws Exception { ArrayBlockingQueue<String> arrayBlockingQueue = concurrentMap.get(this.getBlockQueueKey()); for(;;){// 无限循环从blockQueue中取数据 try { String data = arrayBlockingQueue.poll(1,TimeUnit.SECONDS); if(null==data){ System.out.println(MessageFormat.format("currentThread {0} had no data ",Thread.currentThread().getName())); }else{// System.out.println(data+"-----"); } } catch (InterruptedException e) { e.printStackTrace(); } } } public int getBlockQueueKey() { return blockQueueKey; } public void setBlockQueueKey(int blockQueueKey) { this.blockQueueKey = blockQueueKey; } } } /** * 接收数据的cache类 */ class ReceiveDataCache{ public ReceiveDataCache(){ this.init(); } private void init(){ /** * 1、创建一个concurrentMap来存放系统中的所有BlockingQueue,系统中一共有200个BlockQuere * 2、每个BlockQueue的长度是200 * 以上两个数据结构就是接收数据的缓存结构 */ for(int i = 0 ;i <blockQueueCount ; i++){ concurrentMap.put(i,new ArrayBlockingQueue<String>(blockQuerySize)); } } public void execute(){ ExecutorService executorService = Executors.newFixedThreadPool(blockQueueCount); for(int i = 0 ;i <blockQueueCount ; i++){ ExecuteClass executeClass = new ExecuteClass(); executeClass.setBlockQueueKey(i); executorService.execute(executeClass); } } class ExecuteClass implements Runnable{ private int blockQueueKey ; @Override public void run() { ArrayBlockingQueue<String> arrayBlockingQueue = concurrentMap.get(this.getBlockQueueKey()); int size = 0 ; for(;;){// 无限循环向blockQueue中放数据 try { size ++ ; String str = "block-"+this.getBlockQueueKey()+"thread-"+Thread.currentThread().getName()+"-size-"+size; Thread.sleep(1000); boolean result = arrayBlockingQueue.offer(str); if(!result){ System.out.println(MessageFormat.format("currenThread {0} offer blockQueue {1} had full",Thread.currentThread().getName(),this.getBlockQueueKey())); }else{// System.out.println(str); } } catch (Exception e) { e.printStackTrace(); } } } public int getBlockQueueKey() { return blockQueueKey; } public void setBlockQueueKey(int blockQueueKey) { this.blockQueueKey = blockQueueKey; } } }}
阅读全文
0 0
- 多线程接收数据并缓存到BlockingQueue,然后多线程消费缓存数据
- java 多线程 ThreadPoolExecutor 接收并处理数据
- 数据加载到缓存
- 多线程计算数据,然后合并数据
- csocket的多线程接收数据
- 解析Json数据并缓存图片到sdcard
- 获取缓存数据,并清理
- ios 多线程加载图片,并实现缓存
- android缓存数据到本地
- 什么样的数据适合存放到第二级缓存中(并以Hibernate阐述缓存)
- UDP接收多路视频数据, 接收缓存不足了
- 数据缓存
- 数据缓存
- 【数据缓存】
- 数据缓存
- 数据缓存
- 数据缓存
- 数据缓存
- httpclient在明文传输数据时提示Illegal character的解决办法
- Maven学习(五)- 使用Maven构建Struts2项目
- Tango手机AS开发环境设定
- vue仿京东省市区三级联动选择组件
- Java基础技巧和概念
- 多线程接收数据并缓存到BlockingQueue,然后多线程消费缓存数据
- h5实现本地图片或文件的上传
- leetcode 666. Path Sum IV
- Windows 脚本
- Android 性能优化<八> 多线程优化和线程管理
- JavaEE工程师面试(高级)
- git eclipse 冲突解决
- 计算机组成原理
- SSM做项目时遇到的问题