BlockingQueue 接口源码学习

2024-08-30 05:58

本文主要是介绍BlockingQueue 接口源码学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

java version “1.8.0_221”
Java™ SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot™ 64-Bit Server VM (build 25.221-b11, mixed mode)

介绍

BlockingQueue 是一个接口,并且它还继承了 Queue 接口,在继承 Queue 接口的基础上,增加了一些 阻塞式 的操作。

BlockingQueue 中的成员方法有四种形式,分别满足各个场景的需求:

Throws excepiton 抛出异常Special value 返回特定值Blocks 阻塞直到方法执行成功Times out 阻塞执行直到超时时间再放弃
Insert 插入add(e)offer(e)put(e)offer(e, time, unit)
Remove 移除remove()poll()take()poll(time,unit)
Examineelement()peek()
  • element 和 peek 仅在 Queue 接口中定义,他们都是返回表头元素,唯一不同的是当队列为空时,element() 方法会抛出 NoSuchElementException。

  • BlockingQueue 不接受 NULL 元素,否则会抛出 NullPointerException,还有就是 poll 操作失败时,会返回 NULL。

public interface BlockingQueue<E> extends Queue<E> {/**************** 插入元素 *******************/ /*** 添加元素,成功返回 true;若队列容量满,抛出 IllegalStateException 异常。当使用容量受限的队列时,推荐使用 offer(E e)*/boolean add(E e);/*** 插入成功返回 true,否则返回 false;这个方法好于 add(),add() 插入失败会抛出异常*/boolean offer(E e);/*** 空间足够时直接插入,空间不足时进行等待,直到有空间插入*/void put(E e) throws InterruptedException;/*** 带超时时间的插入,true-插入成功,false-直到超时时间过了还没有插入进去* 等待期间被 interrupted 时,抛出 InterruptedException 异常* 若某些不该添加到这个队列的元素被添加进去时,抛出 IllegalArgumentException 异常*/boolean offer(E e, long timeout, TimeUnit unit)throws InterruptedException;/**************** 删除元素 *******************/ /*** 删除表头元素,若表头元素还不可用,将等待其可用* 等待期间被 interrupted 时,抛出 InterruptedException 异常*/ E take() throws InterruptedException;/*** 带超时时间移除表头元素;若超过时间都没有移除成功,返回 null* 等待期间被 interrupted 时,抛出 InterruptedException 异常*/E poll(long timeout, TimeUnit unit)throws InterruptedException;/*** 移除队列中指定元素(可能存在一个或者多个),若队列发生了更改,返回 true。*/boolean remove(Object o);/**************** 其它方法 *******************/ /*** 返回队列在没有内存或者资源限制下,可以无阻塞地添加元素的数量,一般为 Integer.MAX_VALUE。* 由于同一时刻可能有其它线程也在操作这个队列,所以他的返回值不是一直都是可信地。*/int remainingCapacity();/*** 队列包含该元素(一个或多个, equals 比较元素是否相等)返回 true*/public boolean contains(Object o);/*** 移动队列元素到集合 c 中,这个操作比重复的 poll + add 更有效率。* 但是此过程可能发生异常,并且如果方法执行过程中,c 发生了变化,将会造成不可预知的结果。*/int drainTo(Collection<? super E> c);/*** 移动队列中 maxElements 个元素到集合 c 中*/int drainTo(Collection<? super E> c, int maxElements);}

这篇关于BlockingQueue 接口源码学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1119981

相关文章

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

Spring 中 BeanFactoryPostProcessor 的作用和示例源码分析

《Spring中BeanFactoryPostProcessor的作用和示例源码分析》Spring的BeanFactoryPostProcessor是容器初始化的扩展接口,允许在Bean实例化前... 目录一、概览1. 核心定位2. 核心功能详解3. 关键特性二、Spring 内置的 BeanFactory

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操