【JUC 阻塞队列中常用的四组方法】

2024-01-03 21:28

本文主要是介绍【JUC 阻塞队列中常用的四组方法】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • BlockingQueue 中的 4 组不同的方法
    • ① add,remove,element
    • ② offer,poll,peek
    • ③ put,take
    • ④ offset(o, time, unit),poll(time, unit)


BlockingQueue 中的 4 组不同的方法

抛异常特定值阻塞超时
插入add(o)offset(o)put(o)offset(o, time, unit)
移除remove()poll()take()poll(time, unit)
检查element()peek()

提示:以下是本篇文章正文内容,下面案例可供参考

① add,remove,element

相当于一个普通的队列

富二代,脾气暴躁,稍微不合心意,就会抛出异常(你不说,我都不知道我这么🐂逼呢)。

代码如下(示例)

public class Test {public static void main(String[] args) throws InterruptedException {// 第一组,抛出异常组// add 和 remove,element// 指定容量为 3BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);System.out.println(blockingQueue.add("a"));System.out.println(blockingQueue.add("b"));System.out.println(blockingQueue.add("c"));// 添加第 4 个
//        blockingQueue.add("d");/** 抛出如下异常** Exception in thread "main" java.lang.IllegalStateException: Queue full*/// 判断队列是否为 null,如果是则抛异常,不为空返回队首元素,但不删除System.out.println(blockingQueue.element());// 队列,先进先出System.out.println(blockingQueue.remove());System.out.println(blockingQueue.remove());System.out.println(blockingQueue.remove());// 无元素,仍要出队列
//        System.out.println(blockingQueue.remove());/*** 抛出异常* Exception in thread "main" java.util.NoSuchElementException*/}
}

② offer,poll,peek

还是一个普通的队列
普通人,脾气温和,讲道理,不合适就返回一个特殊值。(施主如果听不懂大乘佛法,贫僧也是略懂一些拳脚)

代码如下(示例)

public class Test {public static void main(String[] args) throws InterruptedException {// 第二组,返回特殊值// offer,poll,peek// 指定容量为 3BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);System.out.println(blockingQueue.offer("a"));System.out.println(blockingQueue.offer("b"));System.out.println(blockingQueue.offer("c"));// 如果队列不为 null,返回队列头元素,队列为空返回 null
//        System.out.println(blockingQueue.peek());// 插入第四个元素
//        System.out.println(blockingQueue.offer("d"));/*** 进不去,返回* false*/System.out.println(blockingQueue.poll());System.out.println(blockingQueue.poll());System.out.println(blockingQueue.poll());System.out.println(blockingQueue.poll());/** 没有第四个,返回* null*/}
}

③ put,take

这时候才是阻塞队列
老实人,一直等待,直到她回心转意(燕子,没有你我怎么活啊~~~)

代码如下(示例)

public class Test {public static void main(String[] args) throws InterruptedException {// 第三组,阻塞(无返回值)// put,takeBlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);blockingQueue.put("a");blockingQueue.put("b");blockingQueue.put("c");//        blockingQueue.put("d");/*** 一直卡住,直到有其他线程取出*/blockingQueue.take();blockingQueue.take();blockingQueue.take();//        blockingQueue.take();/*** 一直卡住,直到有其他线程放入新的元素*/}
}

④ offset(o, time, unit),poll(time, unit)

阻塞队列
土豪,就是任性(给你机会你也不中用啊)

public class Test {public static void main(String[] args) throws InterruptedException {// 第四组,有的等待时间// 容量为 3BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);// 有空间相当于普通的 offsetSystem.out.println(blockingQueue.offer("a", 2L, TimeUnit.SECONDS));System.out.println(blockingQueue.offer("b", 2L, TimeUnit.SECONDS));System.out.println(blockingQueue.offer("c", 2L, TimeUnit.SECONDS));//        System.out.println(blockingQueue.offer("d", 2L, TimeUnit.SECONDS));/** 两秒内不要,我就不给了* 等待两秒后,直接返回 false*/// 有元素,相当于普通的 pollSystem.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));//        System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));/** 两秒内不给,我就不要了*      等待两秒。返回 null**/}
}

这篇关于【JUC 阻塞队列中常用的四组方法】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

Java中Object类的常用方法小结

《Java中Object类的常用方法小结》JavaObject类是所有类的父类,位于java.lang包中,本文为大家整理了一些Object类的常用方法,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. public boolean equals(Object obj)2. public int ha

golang1.23版本之前 Timer Reset方法无法正确使用

《golang1.23版本之前TimerReset方法无法正确使用》在Go1.23之前,使用`time.Reset`函数时需要先调用`Stop`并明确从timer的channel中抽取出东西,以避... 目录golang1.23 之前 Reset ​到底有什么问题golang1.23 之前到底应该如何正确的

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Git中恢复已删除分支的几种方法

《Git中恢复已删除分支的几种方法》:本文主要介绍在Git中恢复已删除分支的几种方法,包括查找提交记录、恢复分支、推送恢复的分支等步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录1. 恢复本地删除的分支场景方法2. 恢复远程删除的分支场景方法3. 恢复未推送的本地删除分支场景方法4. 恢复