LinkedTransferQueue
Posted moris5013
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LinkedTransferQueue相关的知识,希望对你有一定的参考价值。
/** *LinkedTransferQueue是有容量的, * 当第一个生产者线程调用transfer时,如果没有消费者,会阻塞。 * 第二个生产者线程调用transfer时,如果没有消费者,会添加到队列的末尾。 * 直到有消费者进行消费时调用take方法,被阻塞的生产者线程才继续运行 */ /** * LinkedTransferQueue(后称LTQ) 采用一种预占模式。意思就是消费者线程取元素时, * 如果队列为空,那就生成一个节点(节点元素为null)入队, * 然后消费者线程被等待在这个节点上,后面生产者线程入队时发现有一个元素为null的节点, * 生产者线程就不入队了,直接就将元素填充到该节点,并唤醒该节点等待的线程, * 被唤醒的消费者线程取走元素,从调用的方法返回 */ public class LinkedTransferQueueTest { private static LinkedTransferQueue<String> queue = new LinkedTransferQueue<String>(); public static void main(String[] args) throws InterruptedException { ExecutorService executorService = Executors.newCachedThreadPool(); executorService.submit(() -> { try { System.out.println("a == "+queue.take()); } catch (InterruptedException e) { e.printStackTrace(); } }); executorService.submit(() -> { try { System.out.println("b == "+queue.take()); } catch (InterruptedException e) { e.printStackTrace(); } }); executorService.shutdown(); Thread.sleep(50); queue.transfer("hello1"); queue.transfer("hello2"); System.out.println("^^^^^^^^^^"); } }
以上是关于LinkedTransferQueue的主要内容,如果未能解决你的问题,请参考以下文章