zoukankan      html  css  js  c++  java
  • 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("^^^^^^^^^^");
        }
    
    
    }
  • 相关阅读:
    在Objective-C声明Block的几种方式
    属性初始化
    OC协议
    堆排序的OC实现
    iOS 应用性能测试的相关方法、工具及技巧
    墙裂推荐 iOS 资源大全
    剖析@weakify 和 @strongify
    iOS开发大神必备的Xcode插件
    聊聊 KVC 和 KVO 的高阶应用
    TableView的优化
  • 原文地址:https://www.cnblogs.com/moris5013/p/12059161.html
Copyright © 2011-2022 走看看