队列送券的实际应用--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)进行插入操作.进行插入操作的端称为队尾,进行删除操作的端称为队头.队列中没有元素时,称为空队列. 在队列这 ...
随机推荐
- 【Hibernate框架】关联映射(一对多,多对一)
根据我们的总结计划,上篇文章我们总结了有关于一对一映射相关知识,接下来,我们进行下一个阶段,一对多.多对一映射相关知识. 场景设定: 国家规定,一个人只能在一个公司上班,一个公司可以拥有很多员工.我们 ...
- 安装SVN客户端重启电脑之后,右键未出现SVN选项的原因
今天安装SVN客户端明明安装成功,电脑也重启过了,但是就是在右键里找不到SVN,百度了很久,删注册表.建用户组之类的方法都试过了,但是都没有效果. 后来才找到真正的原因,我的安装包是32位的,系统是6 ...
- Qt经典出错信息之undefined reference to `vtable for classname
原文链接:Qt经典出错信息之undefined reference to `vtable for classname 这个出错信息太常见了,用过Qt两个月以上的朋友基本上都能自己解决了,因为太经典了, ...
- 【vuejs小项目】一、脚手架搭建工作
一.关于vuejs 这是一个MVVM的前端开发框架,model(数据).viewmode(通讯).view(视图),它吸取了reactjs和angularjs的长处,核心重点在于组件化的设计原则. 我 ...
- iOS 时间的处理
做App避免不了要和时间打交道,关于时间的处理,里面有不少门道,远不是一行API调用,获取当前系统时间这么简单.我们需要了解与时间相关的各种API之间的差别,再因场景而异去设计相应的机制. 时间的形式 ...
- 北京电子科技学院(BESTI)实验报告4
北京电子科技学院(BESTI)实验报告4 课程: 信息安全系统设计基础 班级:1452.1453 姓名:(按贡献大小排名)周恩德 .郑凯杰 学号:(按贡献大小排名)20145217 .201453 指 ...
- QuartZ Cron表达式
Cron Expressions cron的表达式是字符串,实际上是由七子表达式,描述个别细节的时间表. Seconds Minutes Hours ...
- Codeforces Round #368 (Div. 2)
直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...
- 解决nginx中proxy_pass到tomcat的session丢失问题
之前在配置tomcat的时候都是一个项目对应一个tomcat,也就是一个端口.最近需要把两个项目整合到同一个tomcat中,通过配置nginx让两个域名指向同一tomcat的不同项目.整合完毕后发现其 ...
- codeforces 360 D - Remainders Game
D - Remainders Game Description Today Pari and Arya are playing a game called Remainders. Pari choos ...