美文网首页爱编程,爱生活
java concurrent 之 LinkedBlocking

java concurrent 之 LinkedBlocking

作者: 熬夜的猫头鹰 | 来源:发表于2018-06-16 22:05 被阅读15次

    java concurrent 之 LinkedBlockingQueue

    一个基于已链接节点的、范围任意的 blocking queue。此队列按 FIFO(先进先出)排序元素。队列的头部 是在队列中时间最长的元素。队列的尾部 是在队列中时间最短的元素。新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素。链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知的性能要低。

    可选的容量范围构造方法参数作为防止队列过度扩展的一种方法。如果未指定容量,则它等于 Integer.MAX_VALUE。除非插入节点会使队列超出容量,否则每次插入后会动态地创建链接节点。

    
    BlockingQueue<String> unbounded = new LinkedBlockingQueue<String>();
    BlockingQueue<String> bounded   = new LinkedBlockingQueue<String>(1024);
    
    bounded.put("Value");
    
    String value = bounded.take();
    
    

    可以采用下面的实例进行尝试 take() pull() remove() offer() add()等方法的区别

    package com.viashare.linkedblockingqueue;
    
    import java.util.concurrent.BlockingQueue;
    import java.util.concurrent.LinkedBlockingQueue;
    
    /**
     * Created by Jeffy on 15/12/11.
     */
    public class LinkedBlockingQueueMain {
    
        public static void main(String[] args) throws InterruptedException {
    
            LinkedBlockingQueue<String> linkedBlockingQueue = new LinkedBlockingQueue<>(2);
            new Thread(new ProducerTask(linkedBlockingQueue)).start();
            new Thread(new ConsumerTask(linkedBlockingQueue)).start();
            Thread.currentThread().sleep(10000);
            System.err.println("finished");
        }
    
        static class ProducerTask implements Runnable {
    
            private BlockingQueue<String> queue;
    
            public ProducerTask(BlockingQueue<String> queue) {
                this.queue = queue;
            }
    
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
    
                    queue.put("name1");
                    Thread.sleep(2000);
                    queue.put("name2");
                    Thread.sleep(2000);
                    System.err.println(queue.offer("name3"));
                    System.err.println(queue.size());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        static class ConsumerTask implements Runnable {
    
            private BlockingQueue<String> queue;
    
            public ConsumerTask(BlockingQueue<String> queue) {
                this.queue = queue;
            }
    
            @Override
            public void run() {
                while (true) {
                    try {
                       String info =  queue.peek();
                        System.err.println(info);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
    
            }
        }
    
    }
    
    
    

    相关文章

      网友评论

        本文标题:java concurrent 之 LinkedBlocking

        本文链接:https://www.haomeiwen.com/subject/txfieftx.html