1. package demo7.MQ;
  2. public class QueueData {
  3. private int id;
  4. private String name;
  5. private String taskCode;
  6. public QueueData() {
  7. }
  8. public QueueData(int id, String name, String taskCode) {
  9. this.id = id;
  10. this.name = name;
  11. this.taskCode = taskCode;
  12. }
  13. public int getId() {
  14. return id;
  15. }
  16. public void setId(int id) {
  17. this.id = id;
  18. }
  19. public String getName() {
  20. return name;
  21. }
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25. public String getTaskCode() {
  26. return taskCode;
  27. }
  28. public void setTaskCode(String taskCode) {
  29. this.taskCode = taskCode;
  30. }
  31. }
  1. package demo7.MQ;
  2. import java.util.Random;
  3. import java.util.concurrent.BlockingQueue;
  4. import java.util.concurrent.TimeUnit;
  5. import java.util.concurrent.atomic.AtomicInteger;
  6. public class Provider implements Runnable {
  7. //共享缓存区
  8. private BlockingQueue<QueueData> queue;
  9. //多线程释放启动?
  10. private volatile boolean isRunning = true;
  11. //ID生成器
  12. private static AtomicInteger count = new AtomicInteger();
  13. //生产随机对象
  14. private static Random random = new Random();
  15. public Provider(BlockingQueue<QueueData> queue) {
  16. this.queue = queue;
  17. }
  18. @Override
  19. public void run() {
  20. while (isRunning){
  21. try {
  22. //随机休眠 - 1000 表示读取数据、生产数据的耗时
  23. Thread.sleep(random.nextInt(1000));
  24. //incrementAndGet 进行累加
  25. int id = count.incrementAndGet();
  26. QueueData queueData = new QueueData(id,"任务"+String.valueOf(id),String.valueOf(id).hashCode()+"");
  27. System.err.println("线程:"+Thread.currentThread().getName()+"\t生产task:"+queueData.getName()+"\t"+queueData.getId());
  28. if (!queue.offer(queueData,2, TimeUnit.SECONDS)){
  29. System.err.println("!!!!!!!!!生产数据失败 error");
  30. }
  31. } catch (InterruptedException e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. }
  36. public void stop(){
  37. this.isRunning=false;
  38. }
  39. }
  1. package demo7.MQ;
  2. import java.util.Random;
  3. import java.util.WeakHashMap;
  4. import java.util.concurrent.BlockingQueue;
  5. public class Consumer implements Runnable{
  6. private BlockingQueue<QueueData> queue;
  7. public Consumer(BlockingQueue<QueueData> queue) {
  8. this.queue = queue;
  9. }
  10. private static Random random = new Random();
  11. @Override
  12. public void run() {
  13. while (true){
  14. try {
  15. //take:无阻塞
  16. QueueData queueData = this.queue.take();
  17. Thread.sleep(random.nextInt(1000));
  18. System.err.println("线程:"+Thread.currentThread().getName()+"\t消费task->:"+queueData.getName()+"\t"+queueData.getId());
  19. } catch (InterruptedException e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. }
  24. }
  1. package demo7.MQ;
  2. import java.util.concurrent.BlockingQueue;
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5. import java.util.concurrent.LinkedBlockingQueue;
  6. public class MainMQ {
  7. /**
  8. * 生产者、消费者(多线程模式)
  9. * 1.生产、消费:通常由2类线程,即若干了生产者的线程、若干个消费者的线程、
  10. * 2.生产者线程负责提交用户请求、消费者线程负责处理生产者提交的任务请求
  11. * 3.生产者、消费者之间通过共享内存缓存进行通信
  12. */
  13. public static void main(String[] args) {
  14. //1.内存缓存区
  15. BlockingQueue<QueueData> queueData = new LinkedBlockingQueue<QueueData>();
  16. //2.生产者
  17. Provider p1 = new Provider(queueData);
  18. Provider p2 = new Provider(queueData);
  19. Provider p3 = new Provider(queueData);
  20. //3.消费者
  21. Consumer c1 = new Consumer(queueData);
  22. Consumer c2 = new Consumer(queueData);
  23. Consumer c3 = new Consumer(queueData);
  24. //创建【线程池】运行,可以创建n个线程,没有任务的时候不创建线程,空闲线程存活时间为60s(默认)
  25. ExecutorService executorService = Executors.newCachedThreadPool();
  26. executorService.execute(p1);
  27. executorService.execute(p2);
  28. executorService.execute(p3);
  29. executorService.execute(c1);
  30. executorService.execute(c2);
  31. executorService.execute(c3);
  32. try {
  33. Thread.sleep(2000);
  34. } catch (InterruptedException e) {
  35. e.printStackTrace();
  36. }
  37. p1.stop();
  38. p2.stop();
  39. p3.stop();
  40. try {
  41. Thread.sleep(1000);
  42. } catch (InterruptedException e) {
  43. e.printStackTrace();
  44. }
  45. executorService.shutdown();
  46. }
  47. }

18.并发类容器MQ的更多相关文章

  1. 并发编程(二)------并发类容器ConcurrentMap

    并发类容器: jdk5.0以后提供了多种并发类容器来替代同步类容器从而改善性能. 同步类容器的状态都是串行化的. 他们虽然实现了线程安全,但是严重降低了并发性,在多线程环境时,严重降低了应用程序的吞吐 ...

  2. 同步类容器和并发类容器——ConcurrentMap、CopyOnWrite、Queue

     一 同步类容器同步类容器都是线程安全的,但在某些场景中可能需要加锁来保证复合操作. 符合操作如:迭代(反复访问元素,遍历完容器中所有元素).跳转(根据指定的顺序找到当前元素的下一个元素).条件运算. ...

  3. JUC源码分析-集合篇:并发类容器介绍

    JUC源码分析-集合篇:并发类容器介绍 同步类容器是 线程安全 的,如 Vector.HashTable 等容器的同步功能都是由 Collections.synchronizedMap 等工厂方法去创 ...

  4. 并发编程(三)------并发类容器Copy-On-Write容器

    Copy-On-Write简称COW,是一种用于程序设计中的优化策略.JDK里的COW容器有两种: CopyOnWriteArrayList CopyOnWriteArraySet CopyOnWri ...

  5. Java线程同步类容器和并发容器(四)

    同步类容器都是线程安全的,在某些场景下,需要枷锁保护符合操作,最经典ConcurrentModifiicationException,原因是当容器迭代的过程中,被并发的修改了内容. for (Iter ...

  6. Java 并发编程-再谈 AbstractQueuedSynchronizer 3 :基于 AbstractQueuedSynchronizer 的并发类实现

    公平模式ReentrantLock实现原理 前面的文章研究了AbstractQueuedSynchronizer的独占锁和共享锁,有了前两篇文章的基础,就可以乘胜追击,看一下基于AbstractQue ...

  7. Java并发--同步容器

    为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch).今天我们就来讨论下同步容器. ...

  8. 16.同步类容器Collections.synchronized

    voctor动态数组.同步类容器,底层实现基于:Collections.synchronized package demo5; import java.util.ArrayList; import j ...

  9. 15.同步类容器Vector

    同步类容器1 1.线程都是安全的. 2.在某些场景下需要加锁来保护“复合操作” a.迭代:反复去访问元素.遍历完容器所有的元素 b.跳转:根据下标制定去访问查找元素 c.条件运算 3.复合操作在多线程 ...

随机推荐

  1. Java-贪心算法

    1. 什么是贪心算法? 贪心算法,又称贪婪算法(Greedy Algorithm),是指在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优解出发来考虑,它所做出的仅是在某种意义上的 ...

  2. Name Disambiguation in AMiner-Clustering, Maintenance, and Human in the Loop

    Name Disambiguation in AMiner: Clustering, Maintenance, and Human in the Loop paper:http://keg.cs.ts ...

  3. django使用JWT保存用户登录信息

    在使用前必须弄明白JWT的原理,原理可以看我的另一篇博文:https://www.cnblogs.com/chichung/p/9966027.html JWT的流程 1.签发JWT 在用户正确输入账 ...

  4. 在网站中嵌入VideoJs视频播放器

    一个博客难免需要引用视频来说明内容,但想要自己来实现一个视频播放器是不是一时半会就能完成的,更重要的是这需要对视频播放技术有一定的了解.于是自然而然的有人会想到开源项目.一个不错的选择便是video. ...

  5. jquery请求解析xml

    我们使用jque.ajax来做这个实验.其核心实现原理就是将请求回来的xml数据用$()选择器封装,然后进行傻瓜式操作. 代码如下: 需要注意的是请求数据格式要声明成:xml.不然不生效. $.aja ...

  6. 2.Spark Streaming运行机制和架构

    1 解密Spark Streaming运行机制 上节课我们谈到了技术界的寻龙点穴.这就像过去的风水一样,每个领域都有自己的龙脉,Spark就是龙脉之所在,它的龙穴或者关键点就是SparkStreami ...

  7. react native项目增加devtools工具

    第一步:安装react devtools工具 在当前项目中打开命令行,添加react devtools工具,因为运行的工具有九十几M,下载时需要时间,请耐心等待 yarn add react-devt ...

  8. 用谷歌浏览器Chrome浏览jQuery Mobile页面需要配置Tomcat服务器

    在浏览jQuery Mobile 页面中,除了 Chrome浏览器出错外,其他的浏览器都ok: 这里,是因为需要单独配置 Tomcat 服务: 1.先配置java jdk: 2.下载,安装,配置,To ...

  9. 【Bzoj3527】【Luogu3338】[Zjoi2014]力(FFT)

    题面 Bzoj Luogu 题解 先来颓柿子 $$ F_i=\sum_{j<i}\frac{q_iq_j}{(i-j)^2}-\sum_{j>i}\frac{q_iq_j}{(i-j)^2 ...

  10. 洛谷——P2708 硬币翻转

    P2708 硬币翻转 题目背景 难度系数:☆☆☆☆☆(如果你看懂了) 题目描述 从前有很多个硬币摆在一行,有正面朝上的,也有背面朝上的.正面朝上的用1表示,背面朝上的用0表示.现在要求从这行的第一个硬 ...