java多线程消息队列的实现
来源:互联网 发布:java SQLexists用法 编辑:程序博客网 时间:2024/06/08 11:47
1、定义一个队列缓存池:
//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(); } }//IFif(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(); } }
阅读全文
0 0
- java多线程消息队列的实现
- java多线程:消息队列的实现
- java多线程消息队列的实现
- java多线程消息队列的实现
- java多线程:消息队列
- java多线程消费消息队列
- 消息队列Java的简单实现
- 消息队列的实现
- 利用多线程与消息队列实现聊天
- 到底什么是消息队列?Java中如何实现消息队列?
- java通过ActiveMQ实现JMS的消息队列实例
- 环形消息队列的实现
- 消息的循环队列实现
- 消息队列的简单实现
- c++消息队列的实现
- redis消息队列的实现
- Linux 消息队列的实现
- Java通过DelayQueue的实现多线程任务的阻塞队列
- BZOJ 1746: [Usaco2005 open]Lazy Cows
- 整合测试报告邮件发送
- 算法(一):排序
- 字节流与字符流的区别详解
- 修仙之路
- java多线程消息队列的实现
- spring源代码-aop
- 冒泡法排序及性能优化
- HDU 1024 Max Sum Plus Plus(经典DP)
- CCF CSP 求出现次数最多的值
- 解决ERROR:ANDROID DEX: COM.ANDROID.DEX.DEXINDEXOVERFLOWEXCEPTION: CANNOT MERGE NEW INDEX 66220 INTO A
- laplace_filter.c (@Copyright (C) 2004 University of Texas at Austin: 2-D Laplacian operator)
- bzoj 1012 最大数 maxnumber 线段树
- 详细介绍Opencv实现张正友法相机标定