非阻塞队列的实现

2019 精帖
0 168

基于 双向链表结构

直接代码:

package threadTest.test6;

public class Node<E> {
	private E e;
	private Node<E> prve;
	private Node<E> next;
	public Node(E e) {
		super();
		this.e = e;
	}
	public E getE() {
		return e;
	}
	public void setE(E e) {
		this.e = e;
	}
	public Node<E> getPrve() {
		return prve;
	}
	public void setPrve(Node<E> prve) {
		this.prve = prve;
	}
	public Node() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Node<E> getNext() {
		return next;
	}
	public void setNext(Node<E> next) {
		this.next = next;
	}
	@Override
	protected void finalize() throws Throwable {
		System.out.println("当前对象被释放:"+e);
	}
}
package threadTest.test6;
public class Queue<E> {
	private Node<E> head;//队首
	private Node<E> tail;//队尾
	private Integer size;//队列长度
	private Integer s;//当前队列长度
	/**
	 * 定义队列最大长度 size
	 * @param size
	 */
	public Queue(Integer size) {
		super();
		head = new Node<E>();
		tail = new Node<E>();
		head.setNext(tail);
		head.setPrve(null);
		tail.setNext(null);
		tail.setPrve(head);
		this.size = size;
		this.s=0;
	}
	/**
	 * 默认队列长度为:Integer.MAX_VALUE
	 */
	public Queue() {
		super();
		head = new Node<E>();
		tail = new Node<E>();
		head.setNext(tail);
		head.setPrve(null);
		tail.setNext(null);
		tail.setPrve(head);
		this.size=Integer.MAX_VALUE;
		this.s=0;
	}
	/**
	 * 入队操作
	 * @param e
	 */
	public void push(E e) {
		if(this.s>=this.size) {
			System.err.println("队列已满,入队失败");
			return;
		}
		Node<E> n=new Node<E>(e);
		n.setPrve(tail.getPrve());
		n.setNext(tail);
		tail.getPrve().setNext(n);
		tail.setPrve(n);
		this.s++;
	}
	/**
	 * 出队操作
	 * @return
	 */
	public E pop() {
		if(this.s<=0) {
			System.err.println("空队列");
			return null;
		}
		Node<E> n=head.getNext();
		n.getNext().setPrve(head);
		head.setNext(n.getNext());
		s--;
		return n.getE();
	}
	@Override
	public String toString() {
		Node<E> no=head.getNext();
		while(no!=tail) {
			System.out.println(no.getE());
			no=no.getNext();
		}
		return "";
	}
}
package threadTest.test6;

public class TestMain {
	public static void main(String[] args) {
		Queue<Integer> q=new Queue<>(3);
		q.push(1);
		q.push(2);
		q.push(3);
		q.push(4);
		q.push(5);
		q.push(6);
		System.out.println(q.pop());
		System.out.println(q.pop());
		System.out.println(q.pop());
		System.out.println(q.pop());
	}
}

image.png


留言(0)
加载更多
猜你喜欢
  • blog 迷宫问题-寻找最短路径

    迷宫问题-寻找最短路径算法:广度优先搜索数据结构:,链表代码:<!DOCTYPE html><html> <head> <meta charset='UTF-8'> <title></title> <script> var
  • blog js javascript对象数组浅拷贝和深拷贝

    概念 浅拷贝         只会拷贝一层,如果数组中是对象,则只会拷贝对象引用,如果是基本数据类型则会拷贝值。  深拷贝         多
  • blog js(分钟:秒)倒计时

    js(分钟:秒)倒计时var maxtime = res.data.answerMsg.surplus;var timer = setInterval(function(){ if (maxtime >= 0) {
  • blog websocketweb上传文件进度条

    上次我们说了spring集成websocket,用websocket通讯集成配置连接:http://www.jiajiajia.club/weblog/blog/artical/128下面来模拟一次上传文件进度条 原
  • blog 算法-迷宫问题-广度优先搜索-

    问题描述思路: 典型广度优先搜索算法,根据字典序大小,可以确定遍历循序, 因为字典序D<L<R<U, 所以对于每一个节点优先先往下走,然后向左走,然后向右走,然后向上走。则最后首先到达出口一条路径就是符合题意最短路径。
  • blog spring aop操作日志记录

    spring aop操作日志记录 此次 对 controller中方法执行情况进行记录,记录有方法执行时间,操作人,请求路径,方法入参,模块,功能等。并利用注解方式对被操作方法简单注释(模块
  • blog javaword转pdf在线预览(可以带水印)

    javaword转pdf在线预览(可以带水印) 使用之前需要两个jar包依赖 文件下载地址:http://www.jiajiajia.club/file/info/4uwe2d/111 Java代码 packag
  • blog 二叉树遍历-(递归法)和(递归法)

    整理 二叉树遍历-(递归法)和(递归法)-笔记先序遍历、中序遍历、后续遍历、层级遍历。1.节点信息:package tree;public class Node<E> { private E e;//数据域 private Node<E
  • ofc a* 搜索算法原理( a-star )

    a* 搜索算法原理( a-star )
  • blog java集合之TreeMap原理

    java集合之TreeMap原理         TreeMap集合说简单也简单说复杂也复杂,说简单是因为TreeMap底层完全依靠红黑树这个数据结构,相比与HashMap来说Tr