Blocking Queue三种加入队列方法对比

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

blocking queue有三种加入队列的方法,分别为add(), put(), offer(),那么这三个方法有什么区别,我们可以写一段代码来验证一下

public static void main(String[] args) throws InterruptedException {
        LinkedBlockingQueue<String> linkedBlockingQueue = new LinkedBlockingQueue<>(1);
        linkedBlockingQueue.add("1");

        try {
            linkedBlockingQueue.add("test add");
        } catch (Exception e) {
            System.out.println("------------------------");
            System.out.println("test add method: ");
            e.printStackTrace();
            System.out.println("------------------------");
        }

        boolean offer = linkedBlockingQueue.offer("test offer");
        System.out.println("test offer method: ");
        System.out.println(offer);
        System.out.println("------------------------");

        System.out.println("test put method: ");
        System.out.println("start: " + new Date());
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        executorService.execute(() -> {
            try {
                Thread.sleep(1000);
                linkedBlockingQueue.take();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        linkedBlockingQueue.put("test put");
        System.out.println("end:   " + new Date());
        System.out.println("------------------------");
    }

结果如下:

------------------------
test add method: 
java.lang.IllegalStateException: Queue full
	at java.util.AbstractQueue.add(AbstractQueue.java:98)
	at com.main.MainTest.main(MainTest.java:15)
------------------------
test offer method: 
false
------------------------
test put method: 
start: Mon Jun 22 19:05:14 CST 2020
end:   Mon Jun 22 19:05:15 CST 2020
------------------------

代码模拟的是队列总大小为1的情况,并且队列里已经有一个数据,此时往里面添加元素。从结果可以看出,使用add方法时如果队列已满,会直接抛异常,不会阻塞,而且从jdk源码可以看出来add方法底层实际上调用了offer方法,使用offer方法时,队列满时会返回false,offer还有一个带时间的方法,可以等待一定时间再添加元素,可以认为不是阻塞的,put方法添加元素时从结果时间上可以看出是有阻塞的,可以调大睡眠时间,观察的直观。

所以最终add()和offer()方法不会阻塞,put方法会阻塞

从队列里面删除元素同样有两种方法,poll()和take(),poll不会阻塞,如果没有拿到就返回null,take方法会阻塞直到有数据返回

c++ 实现 blocking queue 阻塞队列就是多线程线程安全的队列,在多线程场景下经常用到,c++ 标准库里面没有提供阻塞队列,boost 中有提供,生成环境下可以使用 blocking queue 实现 主要设计思路: 使用 std::vector 实现一个环形队列,使用两个指针 start end 来标识起止位置,push 的时候在 end 处插入,pop 的时候直接 start 指针往后移即可 使用 std::cond... 阅读详情

相关推荐

LeetCode 1188. Design Bounded Blocking Queue--并发系列--Java 解法--设计有界阻塞队列--使用ArrayBlockingQueueLinkedLi

此文首发于我的Jekyll博客:zhang0peter的个人博客 LeetCode题解文章分类:LeetCode题解文章集合 LeetCode 所有题目总结:LeetCode 所有题目总结 题目地址:Design Bounded Blocking Queue - LeetCode Implement a thread safe bounded blocking queue that has ...

个人博客 1913

BlockingQueue(阻塞队列)详解

BlockingQueue(阻塞队列)详解 原文地址 BlockingQueue 一. 前言 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。 二. 认识Bl...

kaven 2209

C++并发实战:面试题4:生产者消费者试题blocking queue

生产者消费者问题 这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,所有生产者消费者都是异步方式运行的,但它们必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经装

liuxuejiang158的专栏 6138

六:抽象队列同步器AQS应用之BlockingQueue详解

目录 概要 队列类型 队列数据结构 ArrayBlockingQueue LinkedBlockingQueue DelayQueue BlockingQueue API 多线程生产者-消费者示例 并发编程脑图:https://www.processon.com/view/link/5d81dec7e4b04c14c4e7aac8 概要 BlockingQueue,是java.util.concurrent包提供的用于解决并发生产者 - 消费者问题的最有用的类,它的特性是在任意时刻只.

Xx__WangQi的博客 847

Java 阻塞队列 BlockingQueue 介绍: put,add offer 三个方法

在多线程编程中,经常需要使用线程安全的数据结构,用于在不同线程之间进行数据交换通信。Java提供了一种称为阻塞队列BlockingQueue)的数据结构,它是线程安全的队列实现,提供了一些特殊的方法来处理多线程环境下的数据交换问题。本文将介绍阻塞队列的基本概念Java中使用的三种常见方法putaddoffer。阻塞队列是多线程编程中非常实用的数据结构,通过使用 putadd offer 这三个方法,我们可以在多线程环境下实现线程之间的协调同步。

牛肉胡辣汤 3074

阻塞队列包含哪些常用的方法

BlockingQueue 中最常用的添加、删除相关的 8 个方法列出来,并且把它们分为三组,每组方法添加、移除元素相关 这三组方法由于功能很类似,所以比较容易混淆。它们的区别仅在于特殊情况:当队列满了无法添加元素,或者是队列空了无法移除元素时,不同组的方法对于这种特殊情况会有不同的处理方式 抛出异常:add、remove、element 返回结果但不抛出异常:offer、poll、peek 阻塞:put、take 第一组:add、remove、element add 方法 add

vincent_wen0766的博客 599

并发编程-阻塞队列Blocking Queue

阻塞队列Blocking Queue)是一种支持线程安全的队列阻塞插入:但队列满时,插入元素的线程被阻塞,直到队列有空位。阻塞移除:当队列为空时,移除元素的线程被阻塞,知道队列有新元素。超时操作:支持在阻塞时设置超时时间,超时后放弃操作。

weixin_49622776的博客 1064

Java并发编程之Blocking Queue

Blocking Queue A blocking queue is a queue that blocks when you try to dequeue from it and the queue is empty, or if you try to enqueue items to it and the queue is already full. A thread trying to dequeue from an empty queue is blocked until some other th

IBLiplus的博客 670

[多线程]基于阻塞队列(Blocking Queue)的生产消费者模型的实现

[多线程]基于阻塞队列(Blocking Queue)的生产消费者模型的实现

石墨博客 1142

Java中的常用队列

队列是一种由数组链表作为底层构造的只暴露头尾操作API的数据结构,因此,队列是被认为是一种受限的数据结构。 队列的特性是:先进先出,类似于排队,原理如下图所示 队列Queue与SetList同级,都继承了Collection,其次,双端队列接口Deque、阻塞队列BlockingQueue非阻塞队列AvstractQueue实现了Queue接口,以下简述这三个类型的队列Queuejava中实现队列的接口,它总共只有6个方法,如下: Queue的6个方法分类:压入元素(添加):add()、off

m0_67402096的博客 580

JavaConcurrency-Blocking queue(阻塞队列

在开发设计多城中,应该尽量避免Java并发程序设计基础的底层构建块。使用有并发处理的专业人士实现的较高层次的结构要方便安全的多。 许多多线程的问题,可以通过使用一个or多个队列以优雅且安全的当时将其形式化 生产者线程向队列插入元素,消费者线程则取出他们。使用队列,可以安全地从一个线程向另一个线程传递数据。 举列: 考虑银行转账程序,转账线程将转账指令对象插入一个队列中,而不是直接访问银行对象。 另...

其实我也没有太多期盼,毕竟一生太短,少有圆满 237

Java to Architect】Blocking Queue 阻塞队列应对并发

概论 Blocking Queue(阻塞队列) 试图从空队列出列的线程会被阻塞,直到另一个线程将某个项目添加到队列中。 试图添加到满队列的线程会被阻塞,直到另一个线程将某个项目弹出队列。 阻塞队列是并发友好的。 阻塞队列类型(从有界无界角度) 无界阻塞队列(unbounded) 有界阻塞队列(bounded) 无界阻塞队列 BlockingQueue<String> blockingQueue = new LinkedBlockingDeque<>() 无界阻塞队列的容量为

ljinest 175

Disruptor Ring Buffer as a Blocking Queue

Author:Wang, Xinglang  Abstract For any concurrent multi-threaded system, distributed computing or otherwise,the inter-thread messaging component is an very important component. In Java, the JDK p

ebay的专栏 1686

Verilog HDL 学习笔记2-blocking and non-blocking assignment

2013年5月6日 10:42:38 Verilog HDL 学习笔记2-blocking and non-blocking assignment ---学习贵在总结,将学习的心得体会记录   在学习verilog的过程中,碰到的第一块绊脚石就是data type中wire reg的使用,第二块就是blocking non-blocking assignment 的区别使用。现将学习过

LNAmp的专栏 2753

并发编程7 阻塞队列 BlockingQueueQueue,Deque及Blocking

关系 Queue接口 add 添加 offer 添加,不会抛出异常 remove 移除一个元素,空集合抛出异常 poll 移除一个元素,空集合返回null element 查询一个元素,不在队列中删除,空集合抛出异常 peek 查询一个元素,不在队列中删除,空集合返回null BlockingQueue extends Queue put 添加一个元素,如果队列已满阻塞 take 移除一个元素,如果队列已空阻塞 Deque extends Queue 双端队列 addFirst 添加 addLas

aajjw的博客 225

等待队列wait_queue_head_t使用方法

当你在用户空间需要读写一大片数据的时候,这个就用上了。   以下来自:http://www.yuanma.org/data/2006/1207/article_1916.htm 假设我们在 kernel 里产生一个 buffer,user 可以经由 read,write 等 system call 来读取或写资料到这个 buffer 里。如果有一个 user 写资料到 buffe

suwenqiang2011的专栏 3002

C 如何用百行代码实现线程安全的并发队列 | concurrent queue or blocking queue implemented in cpp

本文首发于个人博客https://kezunlin.me/post/cabccf5c/,欢迎阅读最新内容! concurrent queue or blocking queue implemented in cpp Guide introduction Where produce-consumer pattern is present it is often the case that one ...

KeZunLin's blog 1030

[C++]阻塞非阻塞的队列的性能对比(Non-BlockingQueue&BlockingQueue benchmark)

关键字:阻塞队列、非阻塞队列、性能对比、Non-BlockingQueueBlockingQueue、benchmark、Performance   原文作者:@玄冬Wong 转载请注明出处:http://aigo.iteye.com/blog/2292169 对阻塞非阻塞队列进行测试: 1,用boost::lockfree::spsc_queue非阻塞队列;(注:spsc_qu...

玄冬Wong 2019
上一篇: ThreadPoolExecutor使用DiscardPolicy策略时注意
下一篇: 使用docker搭建本机redis集群
世界不只0和1
博客等级 码龄11年 20粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值