阻塞队列BlockingQueue与同步队列SynchronousQueue

news2024/12/30 2:13:52

阻塞队列(BlockingQueue)

    什么情况下我们会使用阻塞队列?

        多线程并发处理,线程池!

使用队列

  • 添加

  • 移除

BlockingQueue四组API

方式有返回值,抛出异常 有返回值,不抛出异常 阻塞等待 超时等待
添加add()offer()put()offer( , , )
移除remove()poll()take()poll( , )
查看队列首元素element()peek()--

    有返回值,抛出异常

        添加 add() 、移除 remove() 、查看队列首元素 element()

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;

public class Test {
    public static void main(String[] args) {
        test();
    }

    //有返回值,抛出异常
    public static void test(){
        // 队列的大小为3
        ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
        // add()方法返回boolean值
        System.out.println(blockingQueue.add("a"));
        System.out.println(blockingQueue.add("b"));
        System.out.println(blockingQueue.add("c"));

        // add添加元素超过队列的长度会抛出异常java.lang.IllegalStateException: Queue full
//        System.out.println(blockingQueue.add("d"));

        System.out.println("=============");

        // remove()返回本次移除的元素
        System.out.println(blockingQueue.remove());
        // 获得队首元素
        System.out.println("队首:" + blockingQueue.element());
        System.out.println(blockingQueue.remove());
        System.out.println(blockingQueue.remove());

        // 队列中没有元素仍继续移除元素会抛出异常java.util.NoSuchElementException
//        System.out.println(blockingQueue.remove());


    }
}

        add添加元素超过队列的长度会抛出异常java.lang.IllegalStateException: Queue full

        队列中没有元素仍继续移除元素会抛出异常java.util.NoSuchElementException

    有返回值,不抛出异常

        添加 offer() 、移除 poll() 、查看队列首元素 peek()

public class Test {
    public static void main(String[] args) {
        test();
    }


    //有返回值,不抛出异常
    public static void test(){
        // 队列的大小为3
        ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);

        // offer返回boolean值
        System.out.println(blockingQueue.offer("a"));
        System.out.println(blockingQueue.offer("b"));
        System.out.println(blockingQueue.offer("c"));

        // offer添加元素超过队列的长度会返回false
        System.out.println(blockingQueue.offer("d"));

        System.out.println("===========");

        // poll()返回本次移除的元素
        System.out.println(blockingQueue.poll());
        // 获得队首元素
        System.out.println("队首:" + blockingQueue.peek());
        System.out.println(blockingQueue.poll());
        System.out.println(blockingQueue.poll());

        // 队列中没有元素仍继续移除元素会打印出null
        System.out.println(blockingQueue.poll());

    }
}

    阻塞等待

        添加 put() 、移除 take()

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;

public class Test {
    public static void main(String[] args) {
        test();
    }

    //阻塞等待,一直等
    public static void test(){
        // 队列的大小为3
        ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);

        try {
            // put没有返回值
            blockingQueue.put("a");
            blockingQueue.put("b");
            blockingQueue.put("c");
            //队列没有位置了,一直阻塞
//            blockingQueue.put("d");


            // take()返回本次移除的元素
            System.out.println(blockingQueue.take());
            System.out.println(blockingQueue.take());
            System.out.println(blockingQueue.take());
            //队列没有元素了,一直阻塞
//            System.out.println(blockingQueue.take());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

        添加元素时,若队列没有位置了,一直阻塞

        移除元素时,若队列没有元素了,一直阻塞

    超时等待

        添加 offer(E e, long timeout, TimeUnit unit) 、移除poll(long timeout, TimeUnit unit)

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;

public class Test {
    public static void main(String[] args) {
        test();
    }


    //超时等待
    public static void test()  {
        // 队列的大小为3
        ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);

        try {
            // offer返回boolean值
            System.out.println(blockingQueue.offer("a", 2, TimeUnit.SECONDS));
            System.out.println(blockingQueue.offer("b", 2, TimeUnit.SECONDS));
            System.out.println(blockingQueue.offer("c", 2, TimeUnit.SECONDS));

            //等待超过2秒,offer添加元素超过队列的长度会返回false;并且等待指定时间后推出,向下执行
            System.out.println(blockingQueue.offer("d", 2, TimeUnit.SECONDS));

            System.out.println("================");

            // poll()返回本次移除的元素
            System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));
            System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));
            System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));

            //等待超过2秒,队列中没有元素仍继续移除元素会打印出null,等待指定之间后退出。
            System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}


同步队列(SynchronousQueue)

        进去一个元素,必须等待取出这个元素后,才能放下一个元素。put()、take()

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;

public class SynchronousQueueDemo {
    public static void main(String[] args) {
        BlockingQueue<Object> blockingQueue = new SynchronousQueue<>();

        new Thread(()->{
            try {
                System.out.println(Thread.currentThread().getName() + " put a");
                blockingQueue.put("a");
                System.out.println(Thread.currentThread().getName() + " put b");
                blockingQueue.put("b");
                System.out.println(Thread.currentThread().getName() + " put c");
                blockingQueue.put("c");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"T1").start();



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

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

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

相关文章

Kubelet v1.25.x源码——StatusManager

1. 环境说明 Kubernetes源码版本&#xff1a;remotes/origin/release-1.25 Kubernetes编译出来的Kubelet版本&#xff1a;Kubernetes v1.24.0-beta.0.2463ee7799bab469d7 Kubernetes集群实验环境&#xff1a;使用Kubernetes v1.25.4二进制的方式搭建了一个单节点集群 K8S 单节…

Linux redhat8.0 NFS共享目录

简介&#xff1a; NFS允许一个系统在网络上与它人共享目录和文件。通过使用NFS&#xff0c;用户和程序可以像访问本地文件一样访问远端系统上的文件。 作用&#xff1a; 多个机器共享一台CDROM或者其他设备。这对于在多台机器中安装软件来说更加便宜跟方便。 员工都可以操作…

流辰信息技术企业凭匠心,助力企业打造专属低代码解决方案!

从建立之初开始&#xff0c;流辰信息技术企业就凭借一股热劲和对低代码开发平台的执着热爱精神&#xff0c;在业界打磨升级&#xff0c;成为众多新老客户朋友青睐和信任的服务商。 在稳定发展的近些年中&#xff0c;流辰信息一直信奉品质和服务是紧跟市场发展步伐的法宝&#x…

maven工程,mybatis,spring

maven 简介&#xff1a;Maven主要用于解决导入依赖于Java类的jar和编译Java项目的主要问题&#xff0c;其使用pom文件将自动管理下载的jar包 创建maven工程 1. groupid:包名 artifactid:工程名 location:存放位置 2.结构 工程目录结构&#xff1a;srcmain主程序区java后端代…

ARM的八种工作模式

ARM有八种工作模式&#xff0c;有些处理器可能是七种&#xff0c;这个要看处理器的版本&#xff0c;早期的处理器如ARM9有七种工作模式&#xff0c;到了后来的Cortex系列新增了一种Secure Monitor模式。对工作模式的理解需要记住以下三点&#xff1a; 不同模式拥有不同的权限不…

基于冲突搜索算法的多机器人路径规划(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Java Request学习笔记

1.获取请求部分的信息方法&#xff1a; Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置响应的内容为html&#xff0c;指定编码为utf-8response.setContentType("text/html;…

如何利用ArcGIS探究环境与生态因子对水体、土壤、大气污染物等影响

如何利用ArcGIS实现电子地图可视化表达&#xff1f;如何利用ArcGIS分析空间数据&#xff1f;如何利用ArcGIS提升SCI论文的层次&#xff1f;制图是地理数据展现的直观形式&#xff0c;也是地理数据应用的必要基础。本次课程从ArcGIS的基本操作、ArcGIS 的空间数据分析及ArcGIS 的…

Biotin-PEG-Fluorescein,FITC-PEG-Biotin,荧光素peg生物素用于纳米粒子

英文名称&#xff1a;FITC-PEG-Biotin&#xff0c;Biotin-PEG-Fluorescein 中文名称&#xff1a;荧光素-聚乙二醇-生物素 FITC-PEG生物素是一种含有荧光素染料和生物素基团的线性异生物功能PEG试剂。荧光素通常被称为FITC&#xff0c;是生物学中常用的荧光示踪剂&#xff0c;…

[附源码]Node.js计算机毕业设计电影网站系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

Flask从入门到放弃三(g对象、Flask-Session的使用、Flask集成Mysql、Wtforms、信号)

文章标题一、g对象二、Flask-Session使用三、数据库连接池1&#xff09;Flask中集成mysql2&#xff09;上面代码存在的问题3&#xff09;使用数据库连接池4&#xff09;压力测试四、WTForms1&#xff09;Python代码2&#xff09;Hmtl代码五、信号一、g对象 介绍 g对象全称glo…

java instanceof关键字详解

instanceof描述 将从操作数堆栈中弹出objectref&#xff0c;它必须是引用类型。无符号indexbyte1和indexbyte2用于将索引构造到当前类的运行时常量池中&#xff08;2.6&#xff09;&#xff0c;其中索引的值为&#xff08;indexbyte1<<8&#xff09;|indexbyte2.索引处的…

node文件上传和下载

node文件上传和下载 一、准备项目 npm install -g express-generator express upload-download然后用vscode打开&#xff0c;安装依赖包&#xff0c;在装一个nodemon #安装依赖npm i# 安装nodemonpm i nodemon -g修改启动命令 启动项目&#xff0c;访问localhost&#xff1a;…

WebDAV之葫芦儿·派盘 + CloudBeats

CloudBeats 支持WebDAV方式连接葫芦儿派盘。 推荐一款手机云端音乐播放器,可以直接播放云盘中的音乐,不占用手机内存,同时也可以播放本地的音频文件,自动扫描,支持离线播放,可以自由创建音乐播放列表。 CloudBeats无需网络即可运行。将专辑,播放列表,文件夹或文件下…

艾美捷游离维多珠单抗ADA水平检测试剂盒,高灵敏度检测

艾美捷游离维多珠单抗ADA水平检测试剂盒用于测定维多利单抗&#xff08;如ENTYVIO&#xff09;的游离人抗体) 适用于EDTA血浆和血清。只用于体外诊断。 引言&#xff1a; 中度至重度活动型溃疡性结肠炎患者克罗恩病&#xff0c;常规治疗或肿瘤坏死因子α&#xff08;TNFα&…

pmp考试多长时间出成绩?

考完大概 6-8 周之后就会出陆续出成绩了&#xff0c;一开始没查到成绩的别着急&#xff0c;出成绩的时间会持续一周左右。 这次 2022年 6 月考的已经在陆续出成绩了&#xff0c;快来查查你过了没 一、查看是否通过 1、登录PMI 官网&#xff0c;点击“Log In” 如果忘记 PMI 的…

rancher 给k8s api 审计日志增加webhook

例子可以参考gosoon / k8s-audit-webhook或者omri86 / k8s-audit-webhook 编译运行。 然后将对应的audit-webhook.yaml&#xff0c;拷贝到/etc/kubernetes/目录下。 然后登录rancher 管控界面&#xff0c;进入Cluster Management 页面 找到对应的集群。 然后点击最后的三个点…

Servlet:狂神源码分析2

目录Demo结构源码分析总结Demo结构 源码分析 1.首先进入web.xml配置一下serlvet路由&#xff0c;也就是serlvet的name&#xff0c;class&#xff0c;以及对应的url-pattern <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http:/…

java计算机毕业设计ssm智慧小区团购系统4x45g(附源码、数据库)

java计算机毕业设计ssm智慧小区团购系统4x45g&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

【云计算与大数据技术】流计算讲解及集群日志文件实时分析实战(附源码)

需要源码请点赞关注收藏后评论区留言私信~~ 一、流计算概述 在传统的数据处理流程中总是先收集数据,然后将数据放到 DB中。当人们需要的 时候通过DB对数据做query,得到答案或进行相关的处理。这样看起来虽然非常合理&#xff0c;采用类似于 MapReduce方式的离线处理并不能很好…