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

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

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

ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别?

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

并发队列类层级

层级图如下:

生产者消费者例子

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并发工具中的队列有哪些?的更多相关文章

  1. 面试刷题11:java系统中io的分类有哪些?

    随着分布式技术的普及和海量数据的增长,io的能力越来越重要,java提供的io模块提供了足够的扩展性来适应. 我是李福春,我在准备面试,今天的问题是: java中的io有哪几种? java中的io分3 ...

  2. Java并发工具类CountDownLatch源码中的例子

    Java并发工具类CountDownLatch源码中的例子 实例一 原文描述 /** * <p><b>Sample usage:</b> Here is a pai ...

  3. 安利一个基于Spring Cloud 的面试刷题系统。面试、毕设、项目经验一网打尽

    推荐: 接近100K star 的Java学习/面试指南 Github 95k+点赞的Java面试/学习手册.pdf 今天给小伙伴们推荐一个朋友开源的面试刷题系统. 这篇文章我会从系统架构设计层面详解 ...

  4. Java并发编程中的相关注解

    引自:http://www.cnblogs.com/phoebus0501/archive/2011/02/21/1960077.html Java并发编程中,用到了一些专门为并发编程准备的 Anno ...

  5. Java并发编程中的若干核心技术,向高手进阶!

    来源:http://www.jianshu.com/p/5f499f8212e7 引言 本文试图从一个更高的视角来总结Java语言中的并发编程内容,希望阅读完本文之后,可以收获一些内容,至少应该知道在 ...

  6. 面试刷题22:CAS和AQS是什么?

    java并发包提供的同步工具和线程池,底层是基于什么原理来设计和实现的呢?这个非常重要. 我是李福春,我在准备面试,今天的题目是: CAS和AQS是什么? 答:CAS是一系列的操作集合,获取当前值进行 ...

  7. Java并发工具类 - CountDownLatch

    Java并发工具类 - CountDownLatch 1.简介 CountDownLatch是Java1.5之后引入的Java并发工具类,放在java.util.concurrent包下面 http: ...

  8. 基于AQS实现的Java并发工具类

    本文主要介绍一下基于AQS实现的Java并发工具类的作用,然后简单谈一下该工具类的实现原理.其实都是AQS的相关知识,只不过在AQS上包装了一下而已.本文也是基于您在有AQS的相关知识基础上,进行讲解 ...

  9. 25.大白话说java并发工具类-CountDownLatch,CyclicBarrier,Semaphore,Exchanger

    1. 倒计时器CountDownLatch 在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种的业务场景下,通常可以使用Thread类的join ...

随机推荐

  1. uboot--tftp

    一.      概述 U-boot中的TFTP用于发送较小的文件.下层使用UDP协议,发送使用UDP 69端口,每次发送的最大分组为512 Bytes.发送双方采用超时重传机制.数据传输模式为octe ...

  2. Spring源码阅读笔记03:xml配置读取

    前面的文章介绍了IOC的概念,Spring提供的bean容器即是对这一思想的具体实现,在接下来的几篇文章会侧重于探究这一bean容器是如何实现的.在此之前,先用一段话概括一下bean容器的基本工作原理 ...

  3. Leetcode1353_最多可以参加的会议数目

    题目地址 给定n个会议时间区间,会议不用全程参加,问最多能参加的数目. 时间区间按左端点排序,扫一遍,每一天把当天开始的区间结束时间加入,同时把这一天之前结束的区间删掉,然后贪心从最小堆取出结束时间的 ...

  4. 如何正确使用redis分布式锁

    前言   笔者在公司担任技术面试官,在笔者面试过程中,如果面试候选人提到了reids分布式锁,笔者都会问一下redis分布式锁的知识点,但是令笔者遗憾的是,该知识点十个人中有九个人都答得不清楚,或者回 ...

  5. java基础进阶篇(二)_Arraylist ------【java源码栈】

    前言 ArrayList 在开发中用到的频率很高,其中原生态提供的方法有一些很好用的重载版本,其中有的坑该跳得跳啊. 一.ArrayList的6种初始化方法1.构造方法 参数为空2.构造方法 参数为L ...

  6. 万字硬核干货!6大技巧,极速提升kubectl的生产力!

    明晚8:30,k3s实战课程开启!将由Rancher研发总监带你畅游k3s与边缘AI的奇妙世界.课程内容完全由实际使用场景中总结而来,别错过啦~!访问以下链接即可传送到课程现场: http://z-m ...

  7. python中if __name__ == '__main__'是什么?

    __name__和__main__认识 作用:一般用于测试程序的功能,if __name__ == '__main__':下面的代码会被执行,但当前.py文件被当做模块导入的时候,main下面的代码就 ...

  8. 将list集合按指定长度进行切分,返回新的List<List<??>>集合

    Lists.partition public class testList { @Test public void test(){ List<Integer> numList = List ...

  9. js实现box(2)(3)这种调用方式的方法

    box(2)(3)函数的调用方法有两种: 第一种: var box = function(num1){ return function(num2){ return num1+num2; }; }; a ...

  10. Yuchuan_Linux_C编程之二 GCC编译

    一.整体大纲  二.gcc编译的四个阶段