java多线程消息队列的实现
2016-05-10 23:19
417 查看
1、定义一个队列缓存池:
//static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。
2、定义队列缓冲池最大消息数,如果达到该值,那么队列检入将等待检出低于该值时继续进行。
3、定义检出线程,如果队列缓冲池没有消息,那么检出线程会线程等待中
4、检入队列
5、锁方法实现
//static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。
private static List<Queue> queueCache = new LinkedList<Queue>();
2、定义队列缓冲池最大消息数,如果达到该值,那么队列检入将等待检出低于该值时继续进行。
private Integer offerMaxQueue = 2000;
3、定义检出线程,如果队列缓冲池没有消息,那么检出线程会线程等待中
new Thread(){ public void run(){ while(true){ String ip = null; try { synchronized (queueCache) { Integer size = queueCache.size(); if(size==0){ //队列缓存池没有消息,等待。。。。 queueCache.wait(); } Queue queue = queueCache.remove(0); if(isIpLock(queueStr)){//假若这个是一个多应用的分布式系统,那么这个判断应该是分布式锁,这里说的锁不是线程停止,而是跳过该消息,滞后处理 queueCache.add(queue);该queue重新加入队列缓冲池,滞后处理, continue; }else{ ;//这里是处理该消息的操作。 } size = queueCache.size(); if(size<offerMaxQueue&&size>=0){ queueCache.notifyAll();//在队列缓存池不超过最大值的前提下,假若检入正在等待中,那么那么让他们排队检入。 } } } catch (Exception e) { e.printStackTrace(); }finally{ try {//检出该消息队列的锁 unIpLock(queueStr); } catch (Execption e) {//捕获异常,不能让线程挂掉 e.printStackTrace(); } } } }.start();
4、检入队列
synchronized (queueCache) { while(true){ Integer size = queueCache.size(); if(size>=offerMaxQueue){ try { queueCache.wait(); continue;//继续执行等待中的检入任务。 } catch (InterruptedException e) { e.printStackTrace(); } }//IF if(size<=offerMaxQueue&&size>0){ queueCache.notifyAll(); } break;//检入完毕 }//while }
5、锁方法实现
/** * 锁 * @param ip * @return * @throws */ public Boolean isLock(String queueStr) { return this.redisManager.setnx(queueStr+"_lock", "LOCK", 10000)!=1; } //解锁 public void unIpLock(String queueStr) { if(ip!=null){ this.redisManager.del(queueStr+"_lock"); // lock.unlock(); } }
相关文章推荐
- Spring AOP事务管理(使用切面把事务管理起来)
- 文章标题 使用ajaxFileupload+struts2完成文件的上传以及回显到jsp的链接地址
- struts2中的jsp值传到后台action接收的三种方法
- java的栈与堆(基本数据类型与包装数据类型)详解
- 第四篇——Spring音乐登录界面设计及实现(C#)
- (Java)LeetCode-12. Integer to Roman
- Java中double类型精度丢失问题
- Spring 系列: Spring 框架简介
- 探秘Java虚拟机——内存管理与垃圾回收
- Spring启动过程
- 使用Java管理Azure(1):基础配置
- 83.JAVA编程思想——关于JAVA性能
- 82.JAVA编程思想——关于垃圾收集
- 81.JAVA编程思想——JAVA编程规则
- 1.2 轻量级JavaEE应用相关技术
- java基础学习总结五(递归算法、冒泡排序、查看生成API)
- 解析扑克牌游戏发牌算法——java实现
- spring boot 学习笔记(1)
- 《java入门第一季》之Arrays类
- 《java入门第一季》之Arrays类