1、定义一个队列缓存池:

private static List queueCache = new LinkedList();

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=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();

}

}

已有 0 人发表留言,猛击->> 这里<

ITeye推荐

java多线程消息队列_java多线程消息队列的实现相关推荐

  1. java消息 框架_java 框架-消息队列ActiveMQ

    https://www.jianshu.com/p/ecdc6eab554c ActiveMQ从入门到精通(一) 22017.03.11 21:40:42字数 2650阅读 57286 这是关于消息中 ...

  2. java 如何判定消息已在队列_Java面试—消息队列

    消息队列面试题 题目来自于中华石杉,解决方案根据自己的思路来总结而得.题目主要如下: 1. 为什么要引入消息队列? 消息队列的引入可以解决3个核心问题: 解耦 异步 削峰 解耦 在一个项目中,如果一个 ...

  3. javax消息队列_Java面试—消息队列

    消息队列面试题 题目来自于中华石杉,解决方案根据自己的思路来总结而得. 题目主要如下: 1. 为什么要引入消息队列? 消息队列的引入可以解决3个核心问题: 解耦 异步 削峰 解耦 在一个项目中,如果一 ...

  4. javax消息队列_java实现消息队列的两种方式(小结)

    实现消息队列的两种方式 Apache ActiveMQ官方实例发送消息 下载解压后拿到java代码实例 然后倒入IDE 如下: 请认真阅读readme.md文件,大致意思就是把项目打成两个jar包,然 ...

  5. java多线程总结图_Java多线程总结之Queue

    标签:多线程(52)JAVA(605) 上个星期总结了一下synchronized相关的知识,这次将Queue相关的知识总结一下,和朋友们分享. 在Java多线程应用中,队列的使用率很高,多数生产消费 ...

  6. java线程代码实现_Java 多线程代码实现讲解

    作为一个完全面向对象的语言,Java提供了类 java.lang.Thread 来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个线程.那么如何提供给 Java 我们要线程执行的代码呢? ...

  7. java 锁旗标_Java多线程

    Java多线程 1. 多线程存在的意义 多线程最大的作用就是能够创建"灵活响应"的桌面程序,而编写多线程最大的困难就是不同线程之间共享资源的问题,要使这些资源不会同时被多个线程访问 ...

  8. java 头尾 队列_Java数据结构之队列(动力节点Java学院整理)

    队列的定义: 队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表. (1)允许删除的一端称为队头(Front). (2)允许插入的一端称为队尾(Rear). (3)当队列中 ...

  9. java线程怎么用_Java多线程基本使用

    一.概念 1.进程 1.1进程:是一个正在进行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元. 1.2线程:就是进程中一个独立的控制单元,线程在控制着进程的执行,一 ...

最新文章

  1. Java HotSpot VM 命令行参数【官方版】
  2. mysql againts函数_MariaDB / MySQL TO_SECONDS和AGGREGATE函数
  3. 计算机病毒的八个特征,计算机病毒的五个特征- 1:.单项选择题(8)
  4. nginx+php-fpm 的配置下,php的错误日志
  5. 什么是Windows Service应用程序?(转)
  6. java同时执行同一个方法吗_java 返回结果的同时执行另一个方法
  7. java 制作报表案例_javaweb项目报表案例
  8. python 删除文件、目录_python脚本删除文件及删除文件目录的方法
  9. P1111 修复公路(并查集)
  10. bugku_本地包含
  11. 2003文件共享服务器搭建,用Windows Server 2003搭建安全文件服务器(2)
  12. 测试 第七章 循环结构进阶 1205 草稿
  13. mips linux gcc mingw,gcc
  14. [Andriod设计模式之旅]——Builder模式
  15. linux racoon代码,源代码安装IPsec-Tools-0.7.2
  16. 在centos中如何用yum安装最新的yum源
  17. zoom下载官网android最新,Zoom手机版app下载安装包-Zoom手机版安卓软件下载v5.0-后壳下载...
  18. hba卡在服务器什么位置,设置服务器通过HBA卡启动目前服务器主流使用的是Qlogic和Emulex.doc...
  19. 记2012.12.20北京CISSP考试通过-“末日”前终于拿到“船票”
  20. Mac 运行windows软件

热门文章

  1. 2022-2028年中国炼钢行业市场研究及前瞻分析报告
  2. Struts2 Cannot create a session after the response has been committed 一个不起眼的错误
  3. 2022-2028年中国瓷砖粘结剂行业市场研究及前瞻分析报告
  4. tf.cast()数据类型转换
  5. LeetCode简单题之验证外星语词典
  6. Halide视觉神经网络优化
  7. 中继TensorRT集成
  8. TVM部署和集成Deploy and Integration
  9. 3D点云点云分割、目标检测、分类
  10. Android 多语言