SynchronousQueue阻塞与ArrayBlockingQueue设置容量为1阻塞的区别

news2024/11/15 15:31:20

SynchronousQueue阻塞的地方是在put进去一个元素即阻塞,没办法继续执行,除非其他线程take该队列的元素。
而ArrayBlockingQueue设置容量为1阻塞的地方是在下一次put,也就是说,put一个元素之后还能继续往下执行代码。

public class Queue {

    public static void main(String[] args) throws InterruptedException {
        testSynchronousQueue();
        TimeUnit.SECONDS.sleep(10);
        System.out.println("=================");
        testBlockingQueue();
    }

    private static void testSynchronousQueue(){
        BlockingQueue<String> blockingDeque = new SynchronousQueue<>();
        new Thread(()->{
            try {
                System.out.println(Thread.currentThread().getName() + "put 1");
                blockingDeque.put("1");
                System.out.println(Thread.currentThread().getName() + "put 2");
                blockingDeque.put("2");
                System.out.println(Thread.currentThread().getName() + "put 3");
                blockingDeque.put("3");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

        new Thread(()->{
            try {
                TimeUnit.SECONDS.sleep(2);
                System.out.println(Thread.currentThread().getName() + "take 1");
                blockingDeque.take();
                TimeUnit.SECONDS.sleep(2);
                System.out.println(Thread.currentThread().getName() + "take 2");
                blockingDeque.take();
                TimeUnit.SECONDS.sleep(2);
                System.out.println(Thread.currentThread().getName() + "take 3");
                blockingDeque.take();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }

    private static void testBlockingQueue(){
        BlockingQueue<String> blockingDeque = new ArrayBlockingQueue<>(1);
        new Thread(()->{
            try {
                System.out.println(Thread.currentThread().getName() + "put 1");
                blockingDeque.put("1");
                System.out.println(Thread.currentThread().getName() + "put 2");
                blockingDeque.put("2");
                System.out.println(Thread.currentThread().getName() + "put 3");
                blockingDeque.put("3");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

        new Thread(()->{
            try {
                TimeUnit.SECONDS.sleep(2);
                System.out.println(Thread.currentThread().getName() + "take 1");
                blockingDeque.take();
                TimeUnit.SECONDS.sleep(2);
                System.out.println(Thread.currentThread().getName() + "take 2");
                blockingDeque.take();
                TimeUnit.SECONDS.sleep(2);
                System.out.println(Thread.currentThread().getName() + "take 3");
                blockingDeque.take();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/907873.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode359周赛

2828. 判别首字母缩略词 核心思想:枚举。只需要枚举首字母和s是否一一对应即可。 2829. k-avoiding 数组的最小总和 核心思想&#xff1a;自己的方法就是哈希表&#xff0c;枚举i的时候&#xff0c;将k-i统计起来&#xff0c;如果出现了那么就跳过。灵神的方法是数学法&#…

Python学习 -- 类对象从创建到常用函数

在Python编程中&#xff0c;类是一种强大的工具&#xff0c;用于创建具有共同属性和行为的对象。本篇博客将详细介绍Python中类和对象的创建&#xff0c;类的属性和方法&#xff0c;以及一些常用的类函数&#xff0c;通过丰富的代码例子来帮助读者深入理解。 一、类和对象的创…

Spring之IoC容器篇

目录 1.Spring简介 1.1Spring框架的核心特性 2.Spring IoC容器 2.1Spring IoC容器特点 2.2出现的背景 2.3关于IoC的理解 2.4案例演示 3.Spring注入方式 3.1set注入 3.2构造注入 3.3接口注入 4.Spring上下文与tomcat整合 4.1思考 4.2代码演示 4.3收获 1.Spring简介…

【内网监控】通过cpolar实现远程监控

【内网监控】通过cpolar实现远程监控 文章目录 【内网监控】通过cpolar实现远程监控前言1. 在cpolar官网预留一个空白隧道2. 完成空白数据隧道&#xff0c;生成地址3. 设置空白隧道的出口4. 空白数据隧道的出口设置5. 获取公网地址6. 打开本地电脑“远程桌面”7. 打开Windows自…

AMBA总线协议(4)——AHB(二)

目录 一、前言 二、AHB操作概述 三、AHB 基本传输 1、简单传输 2、带有等待的传输 3、多重传输 四、AHB传输类型 五、小结 一、前言 在之前的文章中对于AMBA AHB做了一个简单的介绍&#xff0c;AHB 主要用于高性能模块(如 CPU、DMA 和 DSP 等)之间的连接&#x…

【工具使用】Keil5软件使用-进阶调试篇

一、概述 本文面向已经懂得软件基本操作的职业老手&#xff0c;如果是未使用过该软件的小鲜肉&#xff0c;请移步基础篇。这里以STM32芯片为例对工具进行讲解&#xff0c;其他品牌的芯片在调试方面上可能存在差异。 二、软件说明 Keil提供了包括C编译器、宏汇编、链接器、库管…

内核日志过滤

本操作以centos为例。 1、不想把日志存入到 /var/log/messages中&#xff0c;转存到其他文件 >1.1、修改配置文件 /etc/rsyslog.conf vim /etc/rsyslog.conf# 添加以下代码if $programname kernel and ($msg contains hexdump or $msg contains shentong_data_file) then …

如祺出行递表,港交所迎来首位Robotaxi商业化观察对象

港交所近年来持续对新经济公司和科技创新类公司释放善意&#xff0c;接连优化上市条款&#xff0c;摆出“筑巢引凤”姿态。这也让外界对新兴领域的兴趣大大增加。 8月18日&#xff0c;出行科技与服务公司如祺出行正式递表港交所&#xff0c;其业务模式为Robotaxi和有人驾驶网约…

python AI绘图教程

前提 1.安装python 2.安装git 步骤 下载stable-diffusion-webui项目&#xff08;链接&#xff1a;GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI&#xff09; git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git 安装st…

git管理代码

理论上改代码前要pull一次&#xff0c;然后在push前在pull一次 改代码前pull一次是为了获取最新的同步&#xff0c;但是coding也是需要时间的&#xff0c;难保敲代码的这段时间没有人动远程仓库的东西&#xff0c;所以在改完代码要push的时候也应该再pull一下看有无冲突&#x…

《Zookeeper》源码分析(十七)之 LeaderZooKeeperServer

目录 LeaderZooKeeperServer类结构创建LeaderZooKeeperServer加载初始化数据loadData()启动LeaderZooKeeperServersetupRequestProcessors() LeaderZooKeeperServer 类结构 ZooKeeperServer主要是设置了一系列Processor处理器&#xff0c;对于不同的服务器角色有不同的实例类…

论文导读 | Operations Research近期文章精选

推文作者&#xff1a;张曦予 编者按 本期我们选取了七月后半月来自Operations Research的一篇文章以及来自Management Science的四篇文章以飨读者&#xff0c;内容涉及多个方面&#xff0c;我们选取的文章包含了各个方面对于管理以及运筹进行研究的文章&#xff0c;如研究疲劳对…

更新清华软件源时报错:Certificate verification failed: The certificate is NOT trusted.

场景&#xff1a; 在下载libapriltag-dev依赖时&#xff0c;Linux给报了一个错误&#xff1a;E: Unable to locate package libapriltag-dev 。这个错误经常会出现&#xff0c;无法在现有的软件源里找到该安装包或者该依赖&#xff0c;这个时候&#xff0c;首先我们就需要先检查…

服务运营 | MSOR文章精选:远程医疗服务中的统计与运筹(一)

推文作者&#xff1a;蔡君洋&#xff0c;Guo 编者按 《哈佛商业评论》在今年1月20日发表了《是时候巩固远程医疗在美国医疗保健中的地位了&#xff08;It’s Time to Cement Telehealth’s Place in U.S. Health Care&#xff09;》一文。文章指出&#xff0c;在COVID-19大流行…

4.SpringCloud 基本架构

1.SpringCloud概述 Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具&#xff08;例如配置管理&#xff0c;服务发现&#xff0c;断路器&#xff0c;智能路由&#xff0c;微代理&#xff0c;控制总线&#xff0c;一次性令牌&#xff0c;全局锁&#xff0c;…

设置前端项目站标 favicon.ico

1、首先我们需要准备一个小图标利用在线ico工具制作 .ico 的文件 在线工具favicon制作 - 在线工具favicon在线制作,icon制作,网站图标,网站图标制作,ico图标制作https://tool.lu/favicon/选择自己想要制作的小图标&#xff0c;然后选择48*48的下载就可以了 将下载的文件名改为f…

leetcode 123. 买卖股票的最佳时机 III

2023.8.21 本题限制了买卖次数&#xff1a;最多买卖两次。 与之前的股票问题相比&#xff0c;dp数组的第二个维度需要设置四个状态&#xff1a; 第一次持有股票第一次不持有股票第二次持有股票第二次不持有股票 ps&#xff1a;持有股票不等于购买股票&#xff01;&#xff01…

【Git版本控制工具使用---讲解一】

Git版本控制工具使用 安装设置用户名签名和邮箱Git常用的命令 初始化本地库查看本地状态Git 命令添加暂存区提交本地库查看版本信息修改文件版本穿梭 安装 首先根据自身电脑的配置选择性的安装是32位的还是64位的Git版本控制工具 我这边安装的是64位的 以下是我安装的时候的过…

jmeter HTTP信息头管理器

首先&#xff0c;打开JMeter并创建一个新的测试计划。右键单击测试计划&#xff0c;选择"添加" > “线程组”&#xff0c;然后在线程组上右键单击&#xff0c;选择"添加" > “Sampler” > “HTTP请求”。 在HTTP请求中填写服务器的URL和其他必要…