• 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("^^^^^^^^^^");
        }
    
    
    }
  • 相关阅读:
    Java子类与父类的初始化
    悠哈牛奶糖为什么有五种味道单独装的,而不是混合装的
    C++ TinyXml操作(含源码下载)
    动物园海洋馆
    冰上行走
    Tmux : GNU Screen 的替代品
    考虑使用jruby
    关于一些展现的框架
    python抓取google搜索url
    pythonwebkit
  • 原文地址:https://www.cnblogs.com/moris5013/p/12059161.html
Copyright © 2020-2023  润新知