`
jojo_java
  • 浏览: 96563 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

MessageQueue实现

    博客分类:
  • JAVA
 
阅读更多
package me2.jojo.MessageQueue;

import me2.core.data.ResultMessage;

/**
 * Description:修改指针的实现<br>
 * 
 * @author JOJO
 * @version 0.1
 */
public class ResultMsgQueue
{

    private int       size;

    private int       currCount;

    private int       dSize;

    private int       priority;

    private ResultMessage elements[];

    private int       next[];

    private int[]     previous;

    private int       p[][];

    private int       emptyP_Head;

    private int       emptyP_Tail;

    public ResultMsgQueue(int _size, int _priority)
    {
        size = _size;

        currCount = 0;

        priority = _priority;

        dSize = size / 4;

        elements = new ResultMessage[size];

        next = new int[size];

        previous = new int[size];

        p = new int[priority][2];

        for (int i = 0; i < priority; i++)
        {
            p[i][0] = -1;
            p[i][1] = -1;
        }

        for (int i = 0; i < size; i++)
        {
            next[i] = i + 1;
        }
        emptyP_Head = 0;
        emptyP_Tail = size - 1;
    }

    public ResultMsgQueue()
    {
        this(8, 3);
    }

    private/* synchronized */int allocate ()
    {

        int index = emptyP_Head;

        if (emptyP_Head != emptyP_Tail)
        {
            emptyP_Head = next[emptyP_Head];
        }
        else
        {
            emptyP_Tail = emptyP_Head = -1;
        }
        return index;
    }

    public synchronized int put (ResultMessage element)
    {
        int index = allocate();
        if (index == -1)
        {
            // printAll();
            this.distoryPolicy(dSize);
            return -1;
        }
        int priority = element.getPriority();
        elements[index] = element;
        currCount++;
        if (p[priority][0] == -1)
        {
            p[priority][0] = index;
            // 挂接到前面的指针
            int[] previousP = this.getPreviousPointer(priority);
            if (previousP != null)
            {
                next[previousP[1]] = index;
                previous[index] = previousP[1];
            }
        }
        else
        {
            // 插入操作
            next[p[priority][1]] = index;
            previous[index] = p[priority][1];
        }
        // 链接后面的指针
        int[] nextP = this.getNextPointer(priority);
        if (nextP != null)
        {
            next[index] = nextP[0];
            previous[nextP[0]] = index;
        }
        p[priority][1] = index;

        return index;
    }

    public synchronized ResultMessage get ()
    {
        ResultMessage element = null;
        for (int i = 0; i < priority; i++)
        {
            if (p[i][0] != -1)
            {
                int n = p[i][0];
                element = elements[n];
                elements[n] = null;
                currCount--;
                if (p[i][0] == p[i][1])
                {
                    p[i][0] = -1;
                    p[i][1] = -1;
                }
                else
                {
                    p[i][0] = next[n];
                }
                /** ************ */
                if (emptyP_Tail == -1)
                {
                    emptyP_Head = n;
                    emptyP_Tail = n;
                }
                else
                {
                    next[emptyP_Tail] = n;
                    emptyP_Tail = n;
                }
                /** ************ */
                return element;
            }
        }
        return element;
    }

    public void printAll ()
    {
        for (int i = 0; i < size; i++)
        {
            System.out.println(elements[i]);
        }
        System.out.println();
    }

    private synchronized void distoryPolicy (int size)
    {
        //System.out.println("总数:" + currCount);
        int[] lastP = this.getLastPointer();
        if (lastP != null)
        {
            int index = lastP[1];
            emptyP_Tail = index;
            while (size > 0)
            {
                int n = elements[index].getPriority();
                elements[index] = null;
                if (p[n][0] == p[n][1])
                {
                    p[n][0] = -1;// .reset();
                    p[n][1] = -1;
                }
                else
                {
                    p[n][1] = previous[index];
                }
                emptyP_Head = index;
                index = previous[index];
                currCount--;
                size--;
            }
        }
        //System.out.println("销毁之后:" + currCount);
    }

    /**
     * 返回当前队列中的报文数量
     * 
     * @return 队列中的报文数量
     */
    public int size ()
    {
        return currCount;
    }

    public void printFormFirst ()
    {
        ResultMessage element = null;
        while ((element = get()) != null)
        {
            System.out.println(element);
        }
        System.out.println();
    }

    private int[] getFirstPointer ()
    {
        return this.getNextPointer(-1);
    }

    private int[] getLastPointer ()
    {
        return this.getPreviousPointer(priority);
    }

    private int[] getNextPointer (int _priority)
    {
        int n = this.priority - 1;
        while (_priority < n)
        {
            if (p[++_priority][0] != -1) return p[_priority];
        }
        return null;
    }

    private int[] getPreviousPointer (int priority)
    {
        while (priority > 0)
        {
            if (p[--priority][1] != -1) return p[priority];
        }
        return null;
    }
}

 

分享到:
评论

相关推荐

    C# MessageQueue示例

    MessageQueue,又称消息队列,是C#中处理异步通信和解耦组件的重要技术。它允许应用程序之间通过消息传递数据,而无需彼此直接交互。下面将详细介绍C#中的MessageQueue以及如何使用它来发送和接收消息。 1. **...

    活用Android的Message Queue

    在Android开发中,Message Queue是一种重要的机制,用于在不同线程间进行异步通信和任务调度。理解并熟练运用Message Queue、Looper和Handler是构建高效、响应性良好的Android应用的关键。 1. **Message Queue...

    Handler Looper MessageQueue 源码解析

    在Android系统中,Handler、Looper和MessageQueue是实现线程间通信的核心组件,它们共同构建了一个消息处理机制。本文将深入解析这三者的源码,帮助你理解它们的工作原理,并教你如何手写一套自己的Handler系统。 ...

    Message,MessageQueue,Looper,Handler详解

    ### Message,MessageQueue,Looper,Handler详解 #### 一、几个关键概念 ##### 1、MessageQueue:消息队列 MessageQueue是一种数据结构,顾名思义,它充当了一个消息队列的角色,用来存放各种消息对象。每一个线程...

    Handler+Looper+MessageQueue

    在深入理解 Handler、Looper 和 MessageQueue 的工作原理后,我们可以利用它们实现更复杂的异步任务处理,如定时任务、延时操作以及多个消息的有序处理等。同时,它们也是 Android 中其他异步处理机制(如 AsyncTask...

    管理MessageQueue的Looper

    在Android系统中,MessageQueue和Looper是两个非常关键的组件,它们构成了消息处理机制的核心,尤其是在UI线程中。理解并有效地使用它们对于编写高效、响应迅速的Android应用至关重要。 `Looper`是Android中的一个...

    android MessageQueue

    在Android系统中,MessageQueue是消息机制的核心组件之一,它与Handler、Looper紧密协作,用于实现线程间的通信。理解MessageQueue的工作原理对于优化应用程序性能和处理异步操作至关重要。 MessageQueue是一个内部...

    Android的消息处理机制--Message,MessageQueue

    ### Android的消息处理机制详解 #### 一、引言 Android应用程序是通过消息驱动的,它...通过合理使用Message、MessageQueue、Handler和Looper,开发者可以轻松地实现线程间的通信,从而提升应用的性能和用户体验。

    实例MSMQ(MessageQueue)

    MessageQueue queue = new MessageQueue(queuePath); Message msg = new Message(message); queue.Send(msg); } ``` 这里的`queuePath`是队列的路径,例如`".\private$\myQueue"`。`msg`是包含要发送数据的消息...

    Message Queue 3.5.pdf

    MessageQueue消息服务器** - **核心组件**:处理消息的接收、存储和分发。 **2. 代理** - **作用**:作为客户端与消息服务器之间的中介。 - **功能**:负载均衡、路由、安全认证等。 **3. 连接服务** - **定义**...

    Thread,Looper,Handler,Message,MessageQueue,MessagePool之间的关系

    在Android系统中,线程(Thread)、Looper、Handler、Message以及MessageQueue和MessagePool是实现异步消息处理机制的关键组件,它们共同构建了一个高效的事件驱动模型。这些组件的关系紧密,协同工作,使得Android...

    android_os_MessageQueue.rar_android

    在Android操作系统中,MessageQueue是实现线程间通信和异步处理的核心组件。它与Handler、Looper紧密协作,构成了Android消息传递机制的基础。本压缩包文件"android_os_MessageQueue.rar_android"显然关注的是这一...

    Message Queue(消息队列)介绍与应用

    ### Message Queue(消息队列)介绍与应用 #### 消息处理中的主要概念 消息队列作为一种关键的技术组件,在分布式系统中发挥着重要的作用。它主要用于处理和传递数据单元(即消息),这些消息可以在简单的文本字符串...

    sun-jms.rar_jms_message queue

    标题中的"sun-jms.rar_jms_message queue"表明我们关注的是Sun Microsystems实现的JMS规范,以及Message Queue这一特定的消息中间件。Sun Microsystems的Message Queue是早期Oracle公司提供的一个JMS兼容的消息代理...

    windows message queue

    在实现过程中,MSMQ提供了API接口,如`CreateQueue`用于创建队列,`SendMessage`用于发送消息,`ReceiveMessage`用于接收消息等。开发者可以通过这些API在应用程序中集成MSMQ功能。 消息队列还有一些关键特性,例如...

    Message Queue

    在“MessageQueue_Five_version”这个项目中,我们可以推测作者可能使用了其中的一种或多种实现,通过编程接口来创建消息队列,然后在生产者和消费者之间进行消息传递。 接下来,我们讨论Google的语音识别API。...

    Message,MessageQueue,Looper,Handler详解[归类].pdf

    在Android系统中,Message, MessageQueue, Looper, 和 Handler共同构成了一个跨线程通信机制,使得UI线程和其他工作线程之间能安全地交换数据和执行任务,这对于实现复杂的异步操作和保持用户界面的响应性至关重要。...

    handler与looper及messagequeue的简单总结

    在Android开发中,Handler、Looper和MessageQueue是用于实现线程间通信的关键组件,它们共同构建了一个消息处理机制。理解这三个概念以及它们之间的关系对于优化应用程序的性能和响应性至关重要。 Handler(处理器...

    Android 之 Looper、MessageQueue、Handler 与消息循环

    本文详细介绍了Android中消息处理机制的核心组件Looper、MessageQueue和Handler的工作原理及其实现细节。理解这些概念有助于开发者更好地设计和实现多线程应用程序,提高程序的性能和用户体验。通过合理利用这些组件...

Global site tag (gtag.js) - Google Analytics