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并发队列的更多相关文章

  1. 深入理解java:2.3.4. 并发编程concurrent包 之容器ConcurrentLinkedQueue(非阻塞的并发队列---循环CAS)

    1.    引言 在并发编程中我们有时候需要使用线程安全的队列. 如果我们要实现一个线程安全的队列有两种实现方式:一种是使用阻塞算法,另一种是使用非阻塞算法. 使用阻塞算法的队列可以用一个锁(入队和出 ...

  2. [Java 基础] 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法

    reference : http://www.cnblogs.com/linjiqin/archive/2013/05/30/3108188.html 在Java多线程应用中,队列的使用率很高,多数生 ...

  3. 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法

    在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出).Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQ ...

  4. 阻塞队列LinkedBlockingQueue和并发队列ConcurrentLinkedQueue

    LinkedBlockingQueue: public class LinkedBlockingQueue<E> extends AbstractQueue<E> implem ...

  5. 并发队列之:BlockingQueue和ConcurrentLinkedQueue

    一.并行和并发区别: 并行:是指两者同时执行一件事.比如赛跑,两个人都在不停的往前跑: 并发:是指资源有限的情况下,两者交替轮流使用资源.比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给 ...

  6. 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法(转)

    在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出).Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQ ...

  7. 并发队列ConcurrentLinkedQueue、阻塞队列AraayBlockingQueue、阻塞队列LinkedBlockingQueue 区别和使用场景总结

      三者区别与联系: 联系,三者 都是线程安全的.区别,就是 并发  和 阻塞,前者为并发队列,因为采用cas算法,所以能够高并发的处理:后2者采用锁机制,所以是阻塞的.注意点就是前者由于采用cas算 ...

  8. 并发队列ConcurrentLinkedQueue 和 阻塞队列LinkedBlockingQueue用法

    在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出).Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQ ...

  9. 并发队列 ConcurrentLinkedQueue 及 BlockingQueue 接口实现的四种队列

    队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作.进行插入操作的端称为队尾,进行删除操作的端称为队头.队列中没有元素时,称为空队列. 在队列这 ...

随机推荐

  1. Asp.net中延长session失效时间(2点注意web.config和IIS)

    一个是软件系统中的web.config:   配置文件web.config 的<system.web>下加上<sessionState mode="InProc" ...

  2. Windows下搭建Wordpress博客网站

    一:安装wamp Windows下的Apache+Mysql/MariaDB+Perl/PHP/Python,一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使 ...

  3. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

    有时候,当我们使用"mysql"."mysqladmin"."mysqldump"等命令管理数据库时,服务器抛出类似如下错误: 一.错误现场 ...

  4. Json格式示意图

    json视图工具:http://www.bejson.com/jsonviewernew/ 一.Json格式化,(看到数组里面又有数组一下子疑问不是合格json):尾门地址查询: =>=> ...

  5. [转]oracle 分析函数over

      oracle 分析函数over 分析函数(OVER) 目录: =============================================== 1.Oracle分析函数简介 2. O ...

  6. fly bird

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. C++: Virtual Table and Shared Memory

    See at: 补充栏3: C++对象和共享内存 (叙述内容和Link1的内容基本一致) <C++网络编程 卷1:运用ACE和模式消除复杂性> <C++ Network Progra ...

  8. [LintCode] Sort List 链表排序

    Sort a linked list in O(n log n) time using constant space complexity. Have you met this question in ...

  9. pip安装MySQL-python报错

    pip install MySQL-pythonerror: command 'gcc' failed with exit status 1 yum install -y python-develpi ...

  10. 1051. Pop Sequence

    原题连接:https://www.patest.cn/contests/pat-a-practise/1051 题目: Given a stack which can keep M numbers a ...