首先是个队列。
队列的 *** 作有入队和出队
也就是你有一个程序在产生内容然后入队(生产者)
另一个程序读取内容,内容出队(消费者)
这是最最基本的概念。
我想你应该是缺乏一个使用场景。
当你不需要立即获得结果,但是并发量又不能无限大的时候,差不多就是你需要使用消息队列的时候。
比如你写日志,因为可能一个客户端有多个 *** 作去写,又有很多个客户端,显然并发不能无穷大,于是你就需要把写日志的请求放入到消息队列里,在消费者那边依次把队列中产生的日志写到数据库里。
至于怎么实现消息队列,其实你本身一个普通的队列就行呀~看你需要什么附加功能而已。
链队列的定义:
队列的链式存储结构简称为链队列。它是限制仅在表头删除和表尾插入的单链表。
链队列的数据存储形式:
链队列基本运算的实现:
[java] view plain copy
package study_02datastructurequeue;
/
链队列
@author WWX
/
public class LinkQueue<T> {
//链的数据结构
private class Node{
public T data;
public Node next;
//无参构造函数
public Node(){}
public Node(T data,Node next){
thisdata=data;
thisnext=next;
}
}
//队列头指针
private Node front;
//队列尾指针
private Node rear;
//队列长度
private int size=0;
public LinkQueue(){
Node n=new Node(null,null);
nnext=null;
front=rear=n;
}
/
队列入队算法
@param data
@author WWX
/
public void enqueue(T data){
//创建一个节点
Node s=new Node(data,null);
//将队尾指针指向新加入的节点,将s节点插入队尾
rearnext=s;
rear=s;
size++;
}
/
队列出队算法
@return
@author WWX
/
public T dequeue(){
if(rear==front){
try {
throw new Exception("堆栈为空");
} catch (Exception e) {
eprintStackTrace();
}
return null;
}else{
//暂存队头元素
Node p=frontnext;
T x=pdata;
//将队头元素所在节点摘链
frontnext=pnext;
//判断出队列长度是否为1
if(pnext==null)
rear=front;
//删除节点
p=null;
size--;
return x;
}
}
/
队列长队
@return
@author WWX
/
public int size(){
return size;
}
/
判断队列是否为空
@return
@author WWX
/
public boolean isEmpty(){
return size==0;
}
public String toString() {
if(isEmpty()){
return "[]";
}else{
StringBuilder sb = new StringBuilder("[");
for(Node current=frontnext;current!=null;current=currentnext){
sbappend(currentdatatoString() + ", ");
}
int len = sblength();
return sbdelete(len - 2, len)append("]")toString();
}
}
//测试
public static void main(String[] args) {
LinkQueue<Integer> queue=new LinkQueue<Integer>();
queueenqueue(1);
queueenqueue(2);
queueenqueue(3);
queueenqueue(4);
queueenqueue(5);
queueenqueue(6);
Systemoutprintln(queue);
Systemoutprintln("出队:"+queuedequeue());
Systemoutprintln("队列长度="+queuesize());
Systemoutprintln(queue);
Systemoutprintln("出队:"+queuedequeue());
Systemoutprintln("队列长度="+queuesize());
Systemoutprintln(queue);
Systemoutprintln("出队:"+queuedequeue());
Systemoutprintln("队列长度="+queuesize());
Systemoutprintln(queue);
}
}
输出结果:
[1, 2, 3, 4, 5, 6]
出队:1
队列长度=5
[2, 3, 4, 5, 6]
出队:2
队列长度=4
[3, 4, 5, 6]
出队:3
队列长度=3
[4, 5, 6]
你这个只是进队 如果队列满了 只是会打印溢出,并不会对数组integerQueue有任何的影响,所以当 1 2 3 4 5的时候,进来的6并不会加入队列里面。如果出队列你改变的并不是数组,而只是tail,
所以当 队列是 1 2 3 4 5 的时候,出队列了,只是让tail改成3,但是整个数组的长度还是5,所以打印数组的时候还是 1 2 3 4 5
你可以在打印的时候 for(int i=0;i<integerQueuelength;i++)改for(inti=0;i<=tail;i++);
以上就是关于到底什么是消息队列Java中如何实现消息队列全部的内容,包括:到底什么是消息队列Java中如何实现消息队列、java:编写数据访问接口,再分别以堆栈和队列的形式实现、java编写的队列,网上给出的答案我有些迷惑!!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)