zoukankan      html  css  js  c++  java
  • 面试刷题21:java并发工具中的队列有哪些?


    ![image.png](https://img2020.cnblogs.com/other/268922/202003/268922-20200330183801141-1514127119.png)

    java的线程池的工作队列用到了并发队列。
    队列一般用在生产者消费者的场景中,处理需要排队的需求。


    你好,我是李福春,今天的问题是:

    ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别?


    答:都是java提供的并发安全队列,都提供了等待性的操作,take,put 区别如下:

    file

    并发队列类层级


    层级图如下:

    image.png


    生产者消费者例子

    package org.example.mianshi.queue;
    
    import java.util.Objects;
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.BlockingQueue;
    import java.util.stream.IntStream;
    
    /**
     * 作者:     carter
     * 创建日期:  2020/3/30 17:39
     * 描述:     生产者消费者例子
     */
    
    public class ConsumerProduceApp {
    
        public static void main(String[] args) {
    
            BlockingQueue<String> queue = new ArrayBlockingQueue<>(1000);
    
            Producer producer = new Producer(queue);
            Consumer consumer = new Consumer(queue);
    
            producer.start();
            consumer.start();
    
            try {
                producer.join();
                consumer.join();
    
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
        }
    
        public static class Consumer extends Thread {
    
            private BlockingQueue<String> blockingQueue;
    
            public Consumer(BlockingQueue<String> blockingQueue) {
                this.blockingQueue = blockingQueue;
            }
    
            @Override
            public void run() {
    
                String msg = "";
                do {
                    try {
                        msg = blockingQueue.take();
    
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
    
                    System.out.println(msg);
    
                } while (!Objects.equals(msg, "quit"));
    
            }
        }
    
        public static class Producer extends Thread {
    
            private BlockingQueue<String> blockingQueue;
    
            public Producer(BlockingQueue<String> blockingQueue) {
                this.blockingQueue = blockingQueue;
            }
    
            @Override
            public void run() {
    
                IntStream.rangeClosed(1, 100)
                        .forEach(i -> {
                            try {
                                blockingQueue.put("msg" + i);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
    
                        });
    
                try {
                    blockingQueue.put("quit");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
            }
        }
    
    }
    


    有界队列:

    ArrayBlockingQueue: 容量固定,内存连续队列

    LinkedBlockingQueue : 设置大小为有界队列,不设置则为无界队列

    SychronousQueue: 容量为0, take,put操作互相等待


    无界队列:

    PriorityQueue: 优先级无界队列

    DelayedQueue: 延迟无界队列

    队列的选择



    按照是否有界: 一般选择ArrayBlockingQueue , LinkedBlockingQueue 

    按照内存紧密性: ArrayBlockingQueue

    按照吞吐量:LinkedBlockingQueue

    线程接力或者队列信息较少的高性能: SynchronouseQueue


    小结


    本节机会大了ConcurrentBlockingQueue和LinkedBlockingQueue的区别,然后回顾了java提供的队列层级。


    通过一个简单的生产者消费者例子展示了队列的基本使用。


    最后介绍了不同场景下队列的选择。





    image.png

    原创不易,转载请注明出处。

  • 相关阅读:
    清北学堂(2019 5 3) part 6
    清北学堂(2019 5 2) part 5
    清北学堂(2019 5 1) part 4
    dijkstra
    清北学堂(2019 4 30 ) part 3
    2020/5/1
    2020/4/30
    2020/4/29
    HSV模型
    2020/4/28
  • 原文地址:https://www.cnblogs.com/snidget/p/12600362.html
Copyright © 2011-2022 走看看