18.并发类容器MQ
package demo7.MQ;public class QueueData {private int id;private String name;private String taskCode;public QueueData() {}public QueueData(int id, String name, String taskCode) {this.id = id;this.name = name;this.taskCode = taskCode;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getTaskCode() {return taskCode;}public void setTaskCode(String taskCode) {this.taskCode = taskCode;}}
package demo7.MQ;import java.util.Random;import java.util.concurrent.BlockingQueue;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicInteger;public class Provider implements Runnable {//共享缓存区private BlockingQueue<QueueData> queue;//多线程释放启动?private volatile boolean isRunning = true;//ID生成器private static AtomicInteger count = new AtomicInteger();//生产随机对象private static Random random = new Random();public Provider(BlockingQueue<QueueData> queue) {this.queue = queue;}@Overridepublic void run() {while (isRunning){try {//随机休眠 - 1000 表示读取数据、生产数据的耗时Thread.sleep(random.nextInt(1000));//incrementAndGet 进行累加int id = count.incrementAndGet();QueueData queueData = new QueueData(id,"任务"+String.valueOf(id),String.valueOf(id).hashCode()+"");System.err.println("线程:"+Thread.currentThread().getName()+"\t生产task:"+queueData.getName()+"\t"+queueData.getId());if (!queue.offer(queueData,2, TimeUnit.SECONDS)){System.err.println("!!!!!!!!!生产数据失败 error");}} catch (InterruptedException e) {e.printStackTrace();}}}public void stop(){this.isRunning=false;}}
package demo7.MQ;import java.util.Random;import java.util.WeakHashMap;import java.util.concurrent.BlockingQueue;public class Consumer implements Runnable{private BlockingQueue<QueueData> queue;public Consumer(BlockingQueue<QueueData> queue) {this.queue = queue;}private static Random random = new Random();@Overridepublic void run() {while (true){try {//take:无阻塞QueueData queueData = this.queue.take();Thread.sleep(random.nextInt(1000));System.err.println("线程:"+Thread.currentThread().getName()+"\t消费task->:"+queueData.getName()+"\t"+queueData.getId());} catch (InterruptedException e) {e.printStackTrace();}}}}
package demo7.MQ;import java.util.concurrent.BlockingQueue;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.LinkedBlockingQueue;public class MainMQ {/*** 生产者、消费者(多线程模式)* 1.生产、消费:通常由2类线程,即若干了生产者的线程、若干个消费者的线程、* 2.生产者线程负责提交用户请求、消费者线程负责处理生产者提交的任务请求* 3.生产者、消费者之间通过共享内存缓存进行通信*/public static void main(String[] args) {//1.内存缓存区BlockingQueue<QueueData> queueData = new LinkedBlockingQueue<QueueData>();//2.生产者Provider p1 = new Provider(queueData);Provider p2 = new Provider(queueData);Provider p3 = new Provider(queueData);//3.消费者Consumer c1 = new Consumer(queueData);Consumer c2 = new Consumer(queueData);Consumer c3 = new Consumer(queueData);//创建【线程池】运行,可以创建n个线程,没有任务的时候不创建线程,空闲线程存活时间为60s(默认)ExecutorService executorService = Executors.newCachedThreadPool();executorService.execute(p1);executorService.execute(p2);executorService.execute(p3);executorService.execute(c1);executorService.execute(c2);executorService.execute(c3);try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}p1.stop();p2.stop();p3.stop();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}executorService.shutdown();}}
18.并发类容器MQ的更多相关文章
- 并发编程(二)------并发类容器ConcurrentMap
并发类容器: jdk5.0以后提供了多种并发类容器来替代同步类容器从而改善性能. 同步类容器的状态都是串行化的. 他们虽然实现了线程安全,但是严重降低了并发性,在多线程环境时,严重降低了应用程序的吞吐 ...
- 同步类容器和并发类容器——ConcurrentMap、CopyOnWrite、Queue
一 同步类容器同步类容器都是线程安全的,但在某些场景中可能需要加锁来保证复合操作. 符合操作如:迭代(反复访问元素,遍历完容器中所有元素).跳转(根据指定的顺序找到当前元素的下一个元素).条件运算. ...
- JUC源码分析-集合篇:并发类容器介绍
JUC源码分析-集合篇:并发类容器介绍 同步类容器是 线程安全 的,如 Vector.HashTable 等容器的同步功能都是由 Collections.synchronizedMap 等工厂方法去创 ...
- 并发编程(三)------并发类容器Copy-On-Write容器
Copy-On-Write简称COW,是一种用于程序设计中的优化策略.JDK里的COW容器有两种: CopyOnWriteArrayList CopyOnWriteArraySet CopyOnWri ...
- Java线程同步类容器和并发容器(四)
同步类容器都是线程安全的,在某些场景下,需要枷锁保护符合操作,最经典ConcurrentModifiicationException,原因是当容器迭代的过程中,被并发的修改了内容. for (Iter ...
- Java 并发编程-再谈 AbstractQueuedSynchronizer 3 :基于 AbstractQueuedSynchronizer 的并发类实现
公平模式ReentrantLock实现原理 前面的文章研究了AbstractQueuedSynchronizer的独占锁和共享锁,有了前两篇文章的基础,就可以乘胜追击,看一下基于AbstractQue ...
- Java并发--同步容器
为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch).今天我们就来讨论下同步容器. ...
- 16.同步类容器Collections.synchronized
voctor动态数组.同步类容器,底层实现基于:Collections.synchronized package demo5; import java.util.ArrayList; import j ...
- 15.同步类容器Vector
同步类容器1 1.线程都是安全的. 2.在某些场景下需要加锁来保护“复合操作” a.迭代:反复去访问元素.遍历完容器所有的元素 b.跳转:根据下标制定去访问查找元素 c.条件运算 3.复合操作在多线程 ...
随机推荐
- vue数据绑定方式:
1,{{ }} 2,v-text 3,v-html 前两种接受普通变量,第三种绑定带有标签的内容,但是严禁使用,这个会有 XSS危险,(将字符串解析成源代码) 4,v-bind:title=‘m ...
- 将Sphinx的日志放置到/dev/shm里需要注意的事情
可以采用定时器控制,清空日志的办法: 几种快速清空文件内容的方法: $ : > filename #其中的 : 是一个占位符, 不产生任何输出. $ > filename $ echo “ ...
- C#发送Post请求,带参数,不带参数,指定参数
1.不带参数发送Post请求 /// <summary> /// 指定Post地址使用Get 方式获取全部字符串 /// </summary> /// <param na ...
- Vuex ~ 初识
状态:data中的属性需要共享给其他vue组件使用的部分(即data中需要共用的属性) 1.初识vuex直接来个小demo 下面操作都是基于vue-cli,如果不了解先学习下vue-cli 利用n ...
- Template Mode 'HTML5' is deprecated与UnsatisfiedDependencyException
org.thymeleaf.templatemode.TemplateMode : [THYMELEAF][main] Template Mode 'HTML5' is deprecated. Usi ...
- js禁止页面所有a链接访问
<script type="text/javascript"> var arr=document.getElementsByTagName("a") ...
- Java基础知识(二)
一.基本概念 1. Java程序初始化的顺序是怎么样的 2. Java和C++的区别 3. 反射 先看一个知乎回答 什么是反射 主要用途 获得Class对象 4. 注解 什么是注解 为什么要用注解 基 ...
- 文本转化工具dos2unix
文本转化工具dos2unix 由于历史原因,各个平台使用的文本编码规范不同,导致了同一文本在不同平台中显示不同.例如,Windows和Linux的换行符号不同,会造成多行文本显示混乱.为了解决这个 ...
- 调用sort段错误问题
问题:sort的比较函数实现有问题导致进程调用sort时core了. 结论:特别要注意,sort的比较函数必须遵循严格弱排序(strict weak ordering)的规则. 这是最近在工作中遇 ...
- 【数论】【莫比乌斯反演】【线性筛】bzoj2005 [Noi2010]能量采集
http://blog.csdn.net/Clove_unique/article/details/51089272 Key:1.连接平面上某个整点(a,b)到原点的线段上有gcd(a,b)个整点. ...