面试刷题21:java并发工具中的队列有哪些?

面试刷题21:java并发工具中的队列有哪些?

java线程池的工作队列用到了并发队列。

队列一般用在生产者消费者的场景中,处理需要排队的需求

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

ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别?

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

面试刷题21:java并发工具中的队列有哪些?

并发队列类层级

层级图如下:

面试刷题21:java并发工具中的队列有哪些?

生产者消费者例子

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提供的队列层级。

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

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

面试刷题21:java并发工具中的队列有哪些?

原创不易,转载请注明出处,让我们互通有无,共同进步,欢迎沟通交流。

原文 

https://segmentfault.com/a/1190000022205355

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 面试刷题21:java并发工具中的队列有哪些?

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址