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("^^^^^^^^^^");
    }


}
原文地址:https://www.cnblogs.com/moris5013/p/12059161.html