队列送券的实际应用--ConcurrentLinkedQueue并发队列
1、TicketQueue.java--队列封装类,负责如下职责:
a、把活动登记对象放入队列中
b、从队列中获取活动登记对象,并派券
package com.datong.pear.ticket; import java.util.Iterator;
import java.util.concurrent.ConcurrentLinkedQueue; import org.apache.commons.lang.math.NumberUtils;
import org.apache.log4j.Logger; import com.datong.pear.system.common.Constants;
import com.datong.pear.system.common.Result; /**
* 活动登记队列
*
* @author jqlin
*/
public class TicketQueue {
private static ConcurrentLinkedQueue<ActivityRecordModel> linkedQueue = new ConcurrentLinkedQueue<ActivityRecordModel>(); private static final Logger logger = Logger.getLogger(TicketQueue.class); public static boolean isRunning = false; /**
* 活动登记对象放入队列中
*
* @param activityRecord
* @author jqlin
*/
public static void offer(ActivityRecordModel activityRecord) {
if(activityRecord == null){
logger.info(String.format("%s activityRecord is null", TicketQueue.class.getName()));
return;
} if(NumberUtils.toLong(activityRecord.getId(), 0) == 0L){
logger.info(String.format("%s activityRecord.id is illegal,activityRecord.id=%s",
TicketQueue.class.getName(), activityRecord.getId()));
return;
} logger.info(String.format("%s 即将放入队列的活动登记信息:%s", TicketQueue.class.getName(), activityRecord));
if(activityRecord.getState() != Constants.ActivityRecordStatus.WPF){
logger.info(String.format("%s activityRecordId=%s 状态不是未派发,无法放入队列", TicketQueue.class.getName(), activityRecord.getId()));
return;
} logger.info(String.format("%s activityRecordId=%s 准备放入队列", TicketQueue.class.getName(), activityRecord.getId()));
linkedQueue.offer(activityRecord);
logger.info(String.format("----setActivityRecordId=%s *****", activityRecord.getId()));
logger.info(String.format("%s activityRecordId=%s 放入队列成功", TicketQueue.class.getName(), activityRecord.getId()));
logger.info("**********************************************************************");
} /**
* 从队列中获取活动登记对象,并派券
*
* @return
* @author jqlin
*/
public static synchronized void pollAndSendTicket(TicketService ticketService) {
isRunning = true; logger.info("准备从队列中获取活动登记对象,并派券...");
if(linkedQueue != null && !linkedQueue.isEmpty()){
ActivityRecordModel activityRecordModel = null;
while (true) {
Iterator<ActivityRecordModel> arIterator = linkedQueue.iterator();
if(!arIterator.hasNext()){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
logger.info("队列派券异常中断");
} continue;
} activityRecordModel = arIterator.next();
logger.info(String.format("----getActivityRecordId=%s, Thread=%s *****", activityRecordModel.getId(), Thread.currentThread().getId()));
logger.info(String.format("%s 从队列中获取的活动登记信息:%s", TicketQueue.class.getName(), activityRecordModel)); logger.info(String.format("%s activityRecordId=%s 准备移出队列", TicketQueue.class.getName(), activityRecordModel.getId()));
linkedQueue.remove(activityRecordModel);
logger.info(String.format("%s activityRecordId=%s 移出队列成功", TicketQueue.class.getName(), activityRecordModel.getId())); logger.info(String.format("%s activityRecordId=%s 队列派券开始", TicketQueue.class.getName(), activityRecordModel.getId()));
Result result = ticketService.sendTicket(activityRecordModel);
logger.info(String.format("%s 活动登记派券接口返回信息:", TicketQueue.class.getName()));
logger.info(result);
logger.info(String.format("%s 活动登记派券结束", TicketQueue.class.getName())); logger.info("**********************************************************************");
}
} else {
logger.info("队列中活动登记对象为空,没有数据可派券...");
} isRunning = false;
}
}
2、启动线程执行队列
/**
* 通过队列派券
*
* @param ar
* @param ticketService
* @author jqlin
*/
private synchronized void sendTicketByQueue(ActivityRecordModel ar, final TicketService ticketService) {
final ActivityRecordModel activityRecord = ar;
TicketQueue.offer(activityRecord);
//队列为空,启动一个线程
if(!TicketQueue.isRunning) {
new Thread(new Runnable(){
@Override
public void run() {
logger.info("启动一个线程,放入队列派券...");
TicketQueue.pollAndSendTicket(ticketService);
}
}).start(); }
}
队列送券的实际应用--ConcurrentLinkedQueue并发队列的更多相关文章
- 深入理解java:2.3.4. 并发编程concurrent包 之容器ConcurrentLinkedQueue(非阻塞的并发队列---循环CAS)
1. 引言 在并发编程中我们有时候需要使用线程安全的队列. 如果我们要实现一个线程安全的队列有两种实现方式:一种是使用阻塞算法,另一种是使用非阻塞算法. 使用阻塞算法的队列可以用一个锁(入队和出 ...
- [Java 基础] 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
reference : http://www.cnblogs.com/linjiqin/archive/2013/05/30/3108188.html 在Java多线程应用中,队列的使用率很高,多数生 ...
- 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出).Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQ ...
- 阻塞队列LinkedBlockingQueue和并发队列ConcurrentLinkedQueue
LinkedBlockingQueue: public class LinkedBlockingQueue<E> extends AbstractQueue<E> implem ...
- 并发队列之:BlockingQueue和ConcurrentLinkedQueue
一.并行和并发区别: 并行:是指两者同时执行一件事.比如赛跑,两个人都在不停的往前跑: 并发:是指资源有限的情况下,两者交替轮流使用资源.比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给 ...
- 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法(转)
在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出).Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQ ...
- 并发队列ConcurrentLinkedQueue、阻塞队列AraayBlockingQueue、阻塞队列LinkedBlockingQueue 区别和使用场景总结
三者区别与联系: 联系,三者 都是线程安全的.区别,就是 并发 和 阻塞,前者为并发队列,因为采用cas算法,所以能够高并发的处理:后2者采用锁机制,所以是阻塞的.注意点就是前者由于采用cas算 ...
- 并发队列ConcurrentLinkedQueue 和 阻塞队列LinkedBlockingQueue用法
在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出).Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQ ...
- 并发队列 ConcurrentLinkedQueue 及 BlockingQueue 接口实现的四种队列
队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作.进行插入操作的端称为队尾,进行删除操作的端称为队头.队列中没有元素时,称为空队列. 在队列这 ...
随机推荐
- Maven的配置和使用(一)
Selenium已经学习的差不多了,因为之前有开发经验,所以学起来倒是不吃力.在我看来单纯学习selenium这个测试框架是比较简单的,难的是如何理解这个测试框架的构成,如何理解一个自动化测试项目是如 ...
- C#解析json文件的方法
C# 解析 json JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式.它是基于JavaScript语法标准的一个子集. JSON采用完全独立于语言的 ...
- 1.2 控制器 view 的创建和加载
本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末 如果觉得本文内容过长,请前往本人 “简书” 加载优先顺序: 1.用系统的loadView方法创建控制器的视图 2.如果指定 ...
- js学习笔记
javacript笔记根据EC5.0一共有六种数据类型:number,string,bool undefine,nullobject(广义的) --->object(狭义的),array,fun ...
- 用soapUI测试webservice
测试webservice时,有时需要写一个客户端来向服务端发起请求才可以测试服务,最近看到一款工具soap ui,也可以调试VS2010中的程序. 首先要把webservice 发布到本地,网上已经有 ...
- c#List移除列表中的元素
对于一个List<T>对象来说移除其中的元素是常用的功能.自己总结了一下,列出自己所知的几种方法. class Program { static void Main(string[] ar ...
- AmazeUI 框架知识点-布局和样式整理
1.Amaze UI 将所有元素的盒模型设置为 border-box.这下好了,妈妈再也不用担心没计算好 padding.border 而使布局破相了. 2.Amaze UI 将浏览器的基准字号设置为 ...
- sublime 编辑器配置和构建检查
sublime3插件 安装node包 jscs npm install jscs -g jshint npm install jshint -g csscomb npm install csscomb ...
- iOS Block理解
以前看到Block觉得也没什么,不就是类似函数的东西,这东西在C#里就是委托,在Java里就是块,有什么稀奇的.但看到一点进阶的内容后,发现这个东西确实有用. 所以做下总结. 一.块的基本用法 块的语 ...
- bfs判断连通图(无向)
在图论中,连通图基于连通的概念.在一个无向图 G 中,若从顶点vi到顶点vj有路径相连(当然从vj到vi也一定有路径),则称vi和vj是连通的.如果 G 是有向图,那么连接vi和vj的路径中所有的边都 ...