java多线程消息队列的实现代码

 更新时间:2017年07月24日 10:06:59   作者:Mr_linjw  
本篇文章主要介绍了java多线程消息队列的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

本文介绍了java多线程消息队列的实现代码,分享给大家,希望对大家有帮助,顺便也自己留个笔记

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();
 }
 }//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();
  }
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java抢红包的红包生成算法

    Java抢红包的红包生成算法

    现在日常生活中抢红包已经成了日常游戏,本篇文章主要介绍了Java抢红包的红包生成算法,具有一定的参考价值,有需要的可以了解一下。
    2016-11-11
  • RocketMQ消息中间件超详细解读

    RocketMQ消息中间件超详细解读

    这篇文章主要介绍了RocketMQ消息中间件超详细解读,RocketMQ作为一款纯java、分布式、队列模型的开源消息中间件,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等,本文就来详细解读一下,需要的朋友可以参考下
    2023-05-05
  • Java+Swing实现经典五子棋游戏

    Java+Swing实现经典五子棋游戏

    五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一。本文将采用Java Swing实现这一经典游戏,需要的可以参考一下
    2022-01-01
  • IDEA版最新MyBatis程序配置教程详解

    IDEA版最新MyBatis程序配置教程详解

    这篇文章主要介绍了IDEA版最新MyBatis程序配置教程详解,需要的朋友可以参考下
    2020-07-07
  • sentinel整合ribbon与fallback流程分步讲解

    sentinel整合ribbon与fallback流程分步讲解

    这篇文章主要介绍了sentinel整合ribbon与fallback分步流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Java反射获取class对象方式解析

    Java反射获取class对象方式解析

    这篇文章主要介绍了Java反射获取class对象方式解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java线程创建与Thread类的使用方法

    Java线程创建与Thread类的使用方法

    这篇文章主要介绍了Java线程创建与Thread类的使用方法,围绕java多线程中Thread类的使用以及有关线程对象创建和常用方法的相关资料展开详细内容,具有一定的参考价值,需要的下伙伴可以参考一下
    2022-06-06
  • 解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)问题(最新推荐)

    解决org.apache.ibatis.binding.BindingException: Invalid boun

    这篇文章主要介绍了解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • SpringBoot中优化if-else语句的七种方法

    SpringBoot中优化if-else语句的七种方法

    if-else语句是控制流程的基本工具,但过度使用会使代码变得复杂且难以维护,在SpringBoot , SpringCloud项目中,优化if-else结构变得尤为重要,本文将深入探讨七种策略,旨在减少SpringBoot , SpringCloud项目中 if-else的使用,需要的朋友可以参考下
    2024-07-07
  • BUUCTF-easy java WEB-INF/web.xml泄露漏洞及其利用方式

    BUUCTF-easy java WEB-INF/web.xml泄露漏洞及其利用方式

    这篇文章主要介绍了BUUCTF-easy java WEB-INF/web.xml泄露漏洞及其利用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07

最新评论