多线程接收数据并缓存到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;            }        }    }}