- 浏览: 149463 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
EclipseEye:
fair_jm 写道不错 蛮详细的 谢谢分享
SWT/JFace专题 --- SWT中Display和多线程 -
fair_jm:
不错 蛮详细的 谢谢分享
SWT/JFace专题 --- SWT中Display和多线程
Queue
------------
1.ArrayDeque, (数组双端队列)
2.PriorityQueue, (优先级队列)
3.ConcurrentLinkedQueue, (基于链表的并发队列)
4.DelayQueue, (延期阻塞队列)(阻塞队列实现了BlockingQueue接口)
5.ArrayBlockingQueue, (基于数组的并发阻塞队列)
6.LinkedBlockingQueue, (基于链表的FIFO阻塞队列)
7.LinkedBlockingDeque, (基于链表的FIFO双端阻塞队列)
8.PriorityBlockingQueue, (带优先级的无界阻塞队列)
9.SynchronousQueue (并发同步阻塞队列)
-----------------------------------------------------
PriorityBlockingQueue
一个无界优先级阻塞队列,使用与类 PriorityQueue 相同的顺序规则,内部有一个PriorityQueue对象用来实现操作。
------------
1.ArrayDeque, (数组双端队列)
2.PriorityQueue, (优先级队列)
3.ConcurrentLinkedQueue, (基于链表的并发队列)
4.DelayQueue, (延期阻塞队列)(阻塞队列实现了BlockingQueue接口)
5.ArrayBlockingQueue, (基于数组的并发阻塞队列)
6.LinkedBlockingQueue, (基于链表的FIFO阻塞队列)
7.LinkedBlockingDeque, (基于链表的FIFO双端阻塞队列)
8.PriorityBlockingQueue, (带优先级的无界阻塞队列)
9.SynchronousQueue (并发同步阻塞队列)
-----------------------------------------------------
PriorityBlockingQueue
一个无界优先级阻塞队列,使用与类 PriorityQueue 相同的顺序规则,内部有一个PriorityQueue对象用来实现操作。
public class PriorityBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable { private final PriorityQueue<E> q; //内部的PriorityQueue对象用来实现操作 private final ReentrantLock lock = new ReentrantLock(true);//true表示按照FIFO顺序 private final Condition notEmpty = lock.newCondition();//notEmpty条件,由于是无界的,就不会越界,不会用到notFull条件 /** * 默认构造,创建一个默认构造的PriorityQueue */ public PriorityBlockingQueue() { q = new PriorityQueue<E>(); } /** * 初始化容量的构造,创建对应容量的PriorityQueue */ public PriorityBlockingQueue(int initialCapacity) { q = new PriorityQueue<E>(initialCapacity, null); } /** * 指定容量和比较器的构造,同样是创建对应的PriorityQueue */ public PriorityBlockingQueue(int initialCapacity, Comparator<? super E> comparator) { q = new PriorityQueue<E>(initialCapacity, comparator); } /** *指定初始化集合的构造 */ public PriorityBlockingQueue(Collection<? extends E> c) { q = new PriorityQueue<E>(c); } /** * 将指定元素插入此优先级队列,调用offer */ public boolean add(E e) { return offer(e); } /** * 在加锁的情况下,通过PriorityQueue插入 */ public boolean offer(E e) { final ReentrantLock lock = this.lock; lock.lock(); try { boolean ok = q.offer(e); assert ok; notEmpty.signal(); return true; } finally { lock.unlock(); } } /** * 调用offer,插入 */ public void put(E e) { offer(e); // never need to block } /** * 无界,插入不需等待 */ public boolean offer(E e, long timeout, TimeUnit unit) { return offer(e); // never need to block } //获取并移除此队列的头,如果此队列为空,则返回 null。 public E poll() { final ReentrantLock lock = this.lock; lock.lock(); try { return q.poll(); } finally { lock.unlock(); } } //获取并移除此队列的头部,在元素变得【可用】之前一直等待(如果有必要)。 public E take() throws InterruptedException { final ReentrantLock lock = this.lock; lock.lockInterruptibly(); try { try { while (q.size() == 0) notEmpty.await(); } catch (InterruptedException ie) { notEmpty.signal(); // propagate to non-interrupted thread throw ie; } E x = q.poll(); assert x != null; return x; } finally { lock.unlock(); } } //获取并移除此队列的头部,在【指定的等待时间】前等待可用的元素(如果有必要)。 public E poll(long timeout, TimeUnit unit) throws InterruptedException { long nanos = unit.toNanos(timeout); final ReentrantLock lock = this.lock; lock.lockInterruptibly(); try { for (;;) { E x = q.poll(); if (x != null) return x; if (nanos <= 0) return null; try { nanos = notEmpty.awaitNanos(nanos); } catch (InterruptedException ie) { notEmpty.signal(); // propagate to non-interrupted thread throw ie; } } } finally { lock.unlock(); } } //获取但不移除此队列的头;如果此队列为空,则返回 null。 public E peek() { final ReentrantLock lock = this.lock; lock.lock(); try { return q.peek(); } finally { lock.unlock(); } } …… /** * 在加锁的情况下,调用PriorityQueue 实现remove */ public boolean remove(Object o) { final ReentrantLock lock = this.lock; lock.lock(); try { return q.remove(o); } finally { lock.unlock(); } } /** * 在加锁的情况下,调用PriorityQueue 实现contains */ public boolean contains(Object o) { final ReentrantLock lock = this.lock; lock.lock(); try { return q.contains(o); } finally { lock.unlock(); } } …… }-------------------------------------------
/** * SynchronousQueue * 没有内部容量的阻塞队列,因此每一个put()都必须等待一个take(),反之亦然。 * 它非常适合于传递性设计,在这种设计中,在一个线程中运行的对象要将某些信息、 * 事件或任务传递给在另一个线程中运行的对象,它就必须与该对象同步。 */ public class SynchronousQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable { //TransferStack 、TransferQueue 两个类是该抽象类的实现。 //该队列同传入参数fair,如果为true表示队列可保证线程以 FIFO 的顺序进行访问(此刻是用TransferQueue 实现操作), //否则按自然顺序(此刻用TransferStack实现操作)。 //Transferer类通过transfer中参数Object e为空与否,来实现对队列的元素的生产(non-null时)和消费(null时) static abstract class Transferer { abstract Object transfer(Object e, boolean timed, long nanos); } //time常量 static final int NCPUS = Runtime.getRuntime().availableProcessors(); static final int maxTimedSpins = (NCPUS < 2)? 0 : 32; static final int maxUntimedSpins = maxTimedSpins * 16; static final long spinForTimeoutThreshold = 1000L; /** Dual stack */ static final class TransferStack extends Transferer { …… } /** Dual Queue */ static final class TransferQueue extends Transferer { …… } private transient volatile Transferer transferer; public SynchronousQueue() { this(false); } public SynchronousQueue(boolean fair) { transferer = (fair)? new TransferQueue() : new TransferStack(); } //将指定元素添加到此队列 public void put(E o) throws InterruptedException { if (o == null) throw new NullPointerException(); if (transferer.transfer(o, false, 0) == null) { Thread.interrupted(); throw new InterruptedException(); } } //将指定元素插入到此队列,如有必要则等待指定的时间 public boolean offer(E o, long timeout, TimeUnit unit) throws InterruptedException { if (o == null) throw new NullPointerException(); if (transferer.transfer(o, true, unit.toNanos(timeout)) != null) return true; if (!Thread.interrupted()) return false; throw new InterruptedException(); } //将指定元素插入到此队列 public boolean offer(E e) { if (e == null) throw new NullPointerException(); return transferer.transfer(e, true, 0) != null; } //获取并移除此队列的头 public E take() throws InterruptedException { Object e = transferer.transfer(null, false, 0); if (e != null) return (E)e; Thread.interrupted(); throw new InterruptedException(); } //获取并移除此队列的头,如有必要则等待指定的时间 public E poll(long timeout, TimeUnit unit) throws InterruptedException { Object e = transferer.transfer(null, true, unit.toNanos(timeout)); if (e != null || !Thread.interrupted()) return (E)e; throw new InterruptedException(); } public E poll() { return (E)transferer.transfer(null, true, 0); } public boolean isEmpty() { return true; } public int size() { return 0; } public int remainingCapacity() { return 0; } public void clear() { } public boolean contains(Object o) { return false; } public boolean remove(Object o) { return false; } public boolean containsAll(Collection<?> c) { return c.isEmpty(); } public boolean removeAll(Collection<?> c) { return false; } public boolean retainAll(Collection<?> c) { return false; } public E peek() { return null; } …… }
发表评论
-
Nio Socket
2013-05-16 05:53 0asfda -
结合jdk源码解读,Error Exception
2013-05-10 04:00 0/* * @(#)Error.java 1.17 05/11 ... -
从不同的角度,重新审视class和interface
2013-05-07 03:40 0java开发中,对应class和interface的基本区别都 ... -
java.lang.Object
2013-05-07 03:35 0/* * @(#)Object.java 1.73 06/0 ... -
反射机制+类加载机制
2013-02-18 01:30 0反射机制+类加载机制 -
并发专题----使用开源软件Amino构建并发应用程序/多线程运行时分析工具MTRAT
2013-02-14 00:50 1371使用开源软件构建并发 ... -
并发专题 ---- 线程安全
2013-02-14 00:50 746线程安全 ================== ... -
并发专题 --- 锁
2013-02-14 00:50 802相比于synchronized,ReentrantLock 提 ... -
并发专题 ----(JMM)java内存模型
2013-02-14 00:50 534Java 内存模型 ------------ ... -
并发专题 ---java.util.concurrent 包
2013-02-13 02:26 1832java.util.concurrent 包 原 ... -
集合框架 Queue篇(7)---LinkedBlockingDeque
2013-02-07 12:40 850Queue ------------ 1.ArrayDeq ... -
集合框架 Queue篇(6)---LinkedBlockingQueue
2013-02-07 12:39 827Queue ------------ 1.ArrayDeq ... -
集合框架 Queue篇(5)---ArrayBlockingQueue
2013-02-06 10:39 701Queue ------------ 1.ArrayDeq ... -
集合框架 Queue篇(4)---阻塞队列和生产者-消费者模式、DelayQueue
2013-02-06 10:39 994Queue ------------ 1.ArrayDeq ... -
集合框架 Queue篇(3)---ConcurrentLinkedQueue
2013-02-06 10:38 1043Queue ------------ 1.ArrayDequ ... -
集合框架 Queue篇(2)---PriorityQueue
2013-02-06 10:38 831Queue ------------ 1.ArrayDeq ... -
集合框架 Queue篇(1)---ArrayDeque
2013-02-06 10:38 927Queue ------------ 1.ArrayDeq ... -
集合框架 Set篇---HashSet、LinkedHashSet、TreeSet、CopyOnWriteArraySet、ConcurrentSkipList
2013-02-05 08:43 1479Set --------- 1.HashSet 2.Link ... -
集合框架 List篇(2)---CopyOnWriteArrayList
2013-02-05 08:43 840List ----------- 1.ArrayList(jd ... -
集合框架 List篇(1)---ArrayList、LinkedList
2013-02-05 08:42 903List ----------- 1.ArrayList(jd ...
相关推荐
python库。 资源全名:persist_queue-0.4.2-py2.py3-none-any.whl
离线安装包,亲测可用
离线安装包,亲测可用
2. **安装扩展**:如果`laravel-queue-aws-batch-master`是一个GitHub仓库,你可以通过Composer来安装。在终端中运行: ``` composer require <仓库名> ``` 3. **配置Laravel**:在`config/queue.php`中添加AWS ...
官方离线安装包,亲测可用
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
Queue-Queue-Queue
在"promise-queue-plus-master"这个压缩包中,包含了Promise Queue Plus的源代码、文档、示例以及可能的测试用例。开发者可以通过阅读源码了解其内部实现原理,参考文档学习如何在项目中使用,并通过示例快速上手。...
c语言入门 c语言_leetcode题解之406-queue-reconstruction-by-height.c
python库。 资源全名:django_simple_queue-0.1.5-py3-none-any.whl
`laravel-queue-azure-restarter` 是一个解决方案,旨在自动处理这些失败情况,确保工作者在遇到错误后能够重新启动。这个工具可能包含一个监控脚本,该脚本定期检查工作者状态,如果发现工作者因异常停止,就会尝试...
本资源`django_simple_queue-0.1.6-py3-none-any.whl`就是从PyPI官网上获取的一个Python包,适用于Django框架的后台任务队列处理。 **Django框架** Django是一个高级的、免费且开源的Web框架,遵循“干(Keep It ...
【标题】"queue-api-1.0.0-1.zip" 涉及的知识点主要集中在队列API的使用和版本管理上。队列(Queue)是计算机科学中一种基本的数据结构,通常遵循先进先出(FIFO, First In First Out)原则。在Java等编程语言中,...
python库。 资源全名:dask_remote_jobqueue-0.4.2-py3-none-any.whl
在“queue-demo-wwtbnbw.zip”这个压缩包中,我们可以推测它包含了一个Java实现的消息队列示例。Java语言在IT行业中广泛应用于开发高并发、高性能的系统,而消息队列是解决这类问题的关键工具之一。 首先,我们需要...
在"Implementation-of-the-Queue-Interface-master.zip"文件中,我们可以预见到源码可能包含一个或多个类,这些类实现了队列接口。这些类可能使用不同的数据结构来存储元素,例如数组、链表或者双端队列(deque)。...
资源分类:Python库 所属语言:Python 资源全名:redis-queue-tool-4.3.2.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059