java中的阻塞队列二

java中的阻塞队列

SynchronousQueue

SynchronousQueue是一个不存储元素的阻塞队列。每一个put操作必须等待一个take操作,否则不能继java模拟器续添加元素。
它支持公平访问队列。默认情况下线程采用非公平性java环境变量配置策略访java语言问队列。使用以下构造方法可以创建公平性访问的SynchronousQueue,如果设置为true,则等待的线程会采用先进先出的顺序访问队列。

SynchronousQueue可以看成是一个传球手,负责存储过程把生产者线程处理的数据直接传递给javascript消费者线程。队列本身并不存储任何元素,非常适合传递性场景。SjavaeeynchronousQjavascript百炼成仙ueue的吞吐量高于LinkedBlockingQueue和ArrayBlockingQu存储诸天eue。

LinkedTransferQueue

LinkedTrajavascript百炼成仙nsferQueue是一个由链表结构组成的无界阻塞TransferQueue队列javascript。相对于其他阻塞队列,LinkedTransferQueue多了tryTransjavafer和transfer方法。
(1)transfer方法
如果当前有消费者正在等待接收元素(消费者使用take()方法或带时间限制的poll()方法时),transfer方法可以把生产者传入的元素立刻trajava模拟器nsfer(传输)给消费java怎么读者。如果没有消费者在javascript百炼成仙等待接收元素,t存储器ransfer方法会将元素存放在存储器队列的tail节点,并等到该元素被消费者消费了才返回。transfer方法的关键代码如下。

第一行代码是试图把存放当前元素的s节点作为tail节点。第二行存储处理国家秘密的计算机信息代码是让CP存储处理国家秘密的计算机信息U自旋等待消费者消费元素。因为自旋会消耗CPU,所以自旋一定的次数后使用Thread.yield()方法来暂停当前正在执行的线程,并执行其他线程。

(2)tryTransfer方法
tryTransfer方法是用来试探生产者传入的java培训元素是否能直接传给消费者。如果没有消费者等待接存储器中存取速度最快的是收元素,则返回fjavascriptalse。和transfer方法的区别是tryTransfer方法无论消费者是否接收,方法立即返回,而transfer方法是必须等到消费者消费了才返回。

对于带有时间限制的tryTransfer(E e,long timeout,TimeUnit unit)方法,试图把生产者传入的元素直接传给消费者,但是如果没有消费者消存储过程费该元素则等待指定的时间再返回,如果超时还没消费元素,则返回false,如果在超时时java编译器间内消费了元素,则返回true。

LinkedBlockingDeque

LinkedBlockingDeque是一个由链表结构组成的双向阻塞队列。所谓双向队列指的是可以从队列的两端插入和移出元素。双向队列因为多了一个操作队列的入口,在多线程同时入队时,也就减少了一半的竞争。相比其他的阻塞队列,LinkedBlockingDeq存储器ue多了addFirst、addLast、offerFirst、offerLast、peekFirst和peekLast等方法,以First单词结尾的方法,表示插入、获取(peek)或移除双端队列的第一个元素。以Last单词结尾的方法,表示插入、获取或移除双端队列的最后一个元素。

另外,插入方法add等同于addLast,移除方法remove等效于remjava模拟器oveFirst。但是tak存储诸天e方法却等同于takeFirst,不知道是不是JDK的bug,使用时还是用带有First
和Last后缀的方法更清楚。
在初始化LinkedBlocki存储空间清理ngDejava编译器que时可以设置容量防止其过度膨胀。另外,双向阻塞队列可以运用在“工作窃取”模式中。