jdk中队列的实现--阻塞队列和无阻塞队列
来源:互联网 发布:网络直播商业模式 编辑:程序博客网 时间:2024/06/06 01:29
队列有先进先出FIFO和后进先出LIFO两种模式
队列一般都采用链表实现
无阻塞队列:
class QueueElement<T>{//队列节点 QueueElement<T> next=null; QueueElement<T> prev=null; T obj=null; QueueElement(T var1){ this.obj=var1; }}public class Queue<T>{//这是一个双向链表,是一个FIFO模型的队列 int length=0; QueueElement<T> head=null;//头部 QueueElement<T> tail=null;//尾部 public Queue(){} public synchronized void enqueue(T var1){//入队 QueueElement var2=new QueueElement(var1); if(this.head==null){//队列为空 this.head=var2; this.tail=var2; this.length=1; } else { var2.next=this.head; this.head.prev=var2; this.head=var2; this.length++; } this.notify();//唤醒其它线程 } public T dequeue() throws InterruptedException(){//出队 return this.dequeue(0L); } public synchronized T dequeue(long var1){ while(this.tail==null){//队列为空时,等待 this.wait(var1); } QueueElement var3=this.tail; this.tail=var3.prev; if(this.tail==null){//队列只有一个元素 this.head=null; } else { this.tail.next=null;//释放这个节点 } --this.length; return var3.obj; } public synchronized boolean isEmpty(){ return this.tail==null; } public final synchronized Enumeration<T> elements(){ return new FIFOQueueElemerator(this);//获取一个枚举器 } public final synchronized Enumeration<T> reverseElements(){ return new LIFOQueueElemerator(this);//获取一个后进先出的枚举器 }}final class FIFOQueueEnumerator<T> implements Enumeration<T>{ Queue<T> queue; QueueElement<T> cursor; FIFOQueueEnumerator(Queue queue){ this.queue=queue; this.cursor=queue.tail; } public boolean hasMoreElements(){ return this.cursor!=null; } public T nextElement(){ Queue queue=this.queue; synchronized(this.queue){ if(this.cursor!=null){ QueueElement qe=this.cursor; this.cursor=this.cursor.prev; return qe.obj; } } }}final class LIFOQueueEnumerator<T> implements Enumeration<T> { Queue<T> queue; QueueElement<T> cursor; LIFOQueueEnumerator(Queue<T> var1) { this.queue = var1; this.cursor = var1.head; } public boolean hasMoreElements() { return this.cursor != null; } public T nextElement() { Queue var1 = this.queue; synchronized(this.queue) { if(this.cursor != null) { QueueElement var2 = this.cursor; this.cursor = this.cursor.next; return var2.obj; } } throw new NoSuchElementException("LIFOQueueEnumerator"); }}
阻塞队列:
static class Node<E> { E item; Node<E> next; Node(E x) { item = x; } }public void put(E e) throws InterruptException{//入队 if(e ==null){ throw new NullPointerException(); } int c=-1; Node<E> node =new Node(e); final ReentrantLock putLock=this.putLock;//private final ReentrantLock putLock = new ReentrantLock();默认是非公平锁 final AtomicInteger count=this.count;//线程安全的一个类,用于计数 putLock.lockInterruptibly();//获取锁,如果获取失败,则线程中断,等待机会被唤醒。 try{ while(count.get()==capacity){//private final int capacity;是一个成员变量,表示队列容量,默认为Integer.MAX_VALUE; notFull.await();//当队列满了时,线程等。。待 } enqueuw(node);//入队 c=count.getAndIncrement();//队列中元素数量自增1; if(c+1<capacity){ notFull.signal();//还有可用容量 } }finally{ putLock.unlock();//释放锁 } if(c==0) signalNotEmpty();}对于ReentrantLock,在并发编程中另外一文中详解。
阅读全文
0 0
- jdk中队列的实现--阻塞队列和无阻塞队列
- Java阻塞队列的实现
- Java阻塞队列的实现
- Java阻塞队列的实现
- Java阻塞队列的实现
- Java阻塞队列的实现
- c++ 阻塞队列的实现
- Java阻塞队列的实现
- 阻塞队列和阻塞栈
- 阻塞队列和非阻塞队列
- Java5实现阻塞队列
- 实现阻塞队列
- C++阻塞队列实现
- Java5实现阻塞队列
- Java 阻塞队列实现
- 自己实现阻塞队列
- JDK源码分析之DelayQueue无边界阻塞队列类
- 并发队列-无界阻塞优先级队列
- 深入理解Java类加载器(一):Java类加载原理解析
- jdk环境变量的配置
- 备案新站做流量 百度有福利
- 水塘抽样算法
- Android Volley详解(二) 加载网络图片
- jdk中队列的实现--阻塞队列和无阻塞队列
- EventBus源码分析(一):EventBus的使用
- Android Volley详解(三) 自定义Request
- elasticsearch的数据data路径管理
- 如何从Spring官网下载jar包
- swing输入框内容即时同步到其他输入框中
- Android Volley详解(四) 源码分析
- thinkphp3.2 多表事务的实例
- Jquery插件之validator