首页 > 其他分享 >BlockingQueue阻塞队列

BlockingQueue阻塞队列

时间:2023-11-26 17:45:22浏览次数:30  
标签:队列 元素 System 阻塞 println BlockingQueue out blockingQueue

BlockingQueue阻塞队列

BlockingQueue简介

juc包下,BlockingQueue很好的解决了多线程中,高效安全的"传输数据"问题。
阻塞队列,是一个队列,可以是数据从队列的一端输入,从另一端输出。

当队列空时,从队列获取元素线程被阻塞,直到其他线程向空的队列插入新元素。
当队列满时,向队列添加元素线程被阻塞,直到其他线程从队列中移除一个或多个元素或者完全清空,使队列变得空闲起来后新增。
在多线程中,阻塞是指在某些情况下,挂起线程,一旦条件满足,被挂起的线程被自动唤醒。

队列和栈

队列 FIFO(先进先出)
栈 FILO(先进后出)

常用的BlockingQueue子类

ArrayBlockingQueue(常用)

由数组结构组成的有界阻塞队列。

LinkedBlockingQueue(常用)

由链表结构组成的有界(大小默认值为Integer.MAX_VALUE)阻塞队列。

DelayQueue

使用优先级队列实现的延迟无界阻塞队列。

PriorityBlockingQueue

支持优先级排序的无界阻塞队列。

SynchronousQueue

该队列在创建时,有两种模式,公平和非公平。
公平模式会采用公平锁,并使用队列来阻塞多余的生成者和消费者,从而实现整体的公平策略。
非公平模式,采用非公平锁,且使用栈来阻塞多余的生产者和消费者,这种模式下,如果生产者和消费者的处理速度存在差距,则很容易出现饥渴的情况,即可能出现生产不足(消费者在等待生产者),或者生产过剩(有些元素,永远不会被消费)。
总结,不存储元素的同步队列,即存储单个元素的对列。

LinkedBlockingDeque

由链表组成的双休阻塞队列。

BlockingQueue核心方法

方法使用代码
/**
 * @author 长名06
 * @version 1.0
 */
public class BlockingQueueDemo {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);

        //第一组
        //add方法无空间可添加元素,抛IllegalStateException("Queue full")异常 有空间可添加元素,返回true
//        System.out.println(blockingQueue.add("wind-风"));//
//        System.out.println(blockingQueue.add("flower-花"));
//        System.out.println(blockingQueue.add("snow-雪"));
//        System.out.println(blockingQueue.add("moon-月"));
        //System.out.println(blockingQueue.element());

          //remove方法,无元素可用,抛NoSuchElementException异常 有元素可用,返回元素
//        System.out.println(blockingQueue.remove());
//        System.out.println(blockingQueue.remove());
//        System.out.println(blockingQueue.remove());
//        System.out.println(blockingQueue.remove());

        //第二组
        //offer(E e)方法 无空间可添加元素,返回false 有空间可用添加元素,返回true
        //还存在offer(E e)的重载方法offer(E e, long timeout, TimeUnit unit) 对应第四组
        //无空间可添加元素,会等待一段时间,看是否有空间可用添加元素,等待时间内有,添加 没有就返回false
        //有空间可用添加元素,返回true
//        System.out.println(blockingQueue.offer("wind-风"));
//        System.out.println(blockingQueue.offer("flower-花"));
//        System.out.println(blockingQueue.offer("snow-雪"));
//        System.out.println(blockingQueue.offer("moon-月"));
//
          //poll方法,无元素可用,返回null 有元素可用,返回元素
//        System.out.println(blockingQueue.poll());
//        System.out.println(blockingQueue.poll());
//        System.out.println(blockingQueue.poll());
//        System.out.println(blockingQueue.poll());
        //第三组
        //put方法注释
        //Inserts the specified element into this queue, waiting if necessary for space to become available.
        //put方法,如果队列已满,就一直等待,直到队列可用添加元素 put方法无返回值
        blockingQueue.put("wind-风");
        blockingQueue.put("flower-花");
        blockingQueue.put("snow-雪");
        System.out.println("队列已满");
        System.out.println(blockingQueue.offer("moon-月", 3L, TimeUnit.SECONDS));
//        blockingQueue.put("moon-月");

        //take方法注释
        //Retrieves and removes the head of this queue, waiting if necessary until an element becomes available.
        //take方法,不为空返回元素 如果队列为空,就一直阻塞,等待队列中有元素可用
//        System.out.println(blockingQueue.take());
//        System.out.println(blockingQueue.take());
//        System.out.println(blockingQueue.take());
//        System.out.println("队列已空");
//        blockingQueue.take();

        //第四组
        //poll方法注释
        //Retrieves and removes the head of this queue, waiting up to the specified wait time if necessary for an element to become available.
        //poll方法,取元素,如果队列不为空,返回元素
        // 如果队列为空,会等待一段时间,看是否有元素可用,没有就返回null
        System.out.println(blockingQueue.poll(3L, TimeUnit.SECONDS));
        System.out.println(blockingQueue.poll(3L, TimeUnit.SECONDS));
        System.out.println(blockingQueue.poll(3L, TimeUnit.SECONDS));
//        System.out.println(blockingQueue.poll(3L, TimeUnit.SECONDS));
    }
}

只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。

标签:队列,元素,System,阻塞,println,BlockingQueue,out,blockingQueue
From: https://www.cnblogs.com/changming06/p/17857567.html

相关文章

  • 数据结构之优先队列(java)
    一:概述队列的特点是:先进先出(FIFO).入队列,将元素置于队尾;出队列,队头元素最先被移出:优先队列不遵循先入先出的原则,而是分两种情况。最大优先队列,无论入队顺序如何,都是当前最大的元素优先出队最小优先队列,无论入队顺序如何,都是当前最小的元素优先出队。例如有一个最大优先队列,其中的......
  • 万字长文:从 C# 入门学会 RabbitMQ 消息队列编程
    RabbitMQ教程 目录RabbitMQ教程RabbitMQ简介安装与配置安装RabbitMQ发布与订阅模型生产者、消费者、交换器、队列多工作队列交换器类型DirectFanoutTopic交换器绑定交换器消费者、消息属性Qos、拒绝接收消息确认模式消息持久化消息TTL时......
  • 7-2 队列应用(蓝桥杯)
    importjava.util.LinkedList;importjava.util.Queue;importjava.util.Scanner; publicclassMain{    publicstaticvoidmain(String[]args){        Scannersc=newScanner(System.in);        Queue<String>vip=newLinkedList<>();......
  • socket 的阻塞模式和非阻塞模式
    1.socket的阻塞模式和非阻塞模式在阻塞和非阻塞模式下,常讨论的具有不同行为表现的socket函数一般有connect、accept、send和recv。在Linux上对socket进行操作时也包括write函数和read函数。在Linux上,可以使用fcntl函数或ioctl函数给创建的socket增加ON......
  • RabbitMQ -- 延迟队列(死信队列中的消息TTL过期)
    用来存放需要在指定时间被处理的元素队列,队列中的元素希望在指定时间被取出和处理使用场景:订单在十分钟内未支付自动取消新创建的店铺,如果在十天之内没有上传过商品,则自定发送消息提醒用户注册成功后,如果三天内没有登录则进行短信提醒用户发起退款后,如果三天内没有得到处理则通知相......
  • Odoo16_queue_job第三方异步队列
    1.安装第三方模块queue_jobqueue/queue_jobat16.0·OCA/queue·GitHub2.odoo配置文件,启动多workersworkers=3proxy_mode=Trueserver_wide_modules=web,queue_job[queue_job]channels=root:23.使用方法fromodooimportmodels,fields,apiclass......
  • 队列存放用户请求,执行耗时操作的解决方案
    队列存放用户请求的实现方案直接上图待补充……......
  • 关于阻塞多线程
    关于阻塞多线程同步方式理解:一个循环循环100次。多线程方式理解:开10个循环同时执行循环,每个循环循环10次。......
  • 队列和循环队列(ArrayQueueAndCircleQueue)
    队列数组队列1.初始化队列privateintmaxsize;//最大长度privateintfront;//指向队首的前一个位置privateintrear;//指向队尾privateint[]arr;publicArrayQueue(intmaxsize){this.maxsize=maxsize;arr=newint[maxsize];......
  • 【题目-理想的正方形】 二维单调队列
    理想的正方形(二维单调队列)题目acwing.1091理想的正方形题解题目很好做,主要学习一下二维单调队列的写法首先将每行各窗口内最值用单调队列维护出来,保存在rmax中接着对rmax各列,将每列最值用单调队列维护出来,保存在cmax中,最后cmax中存的就是行和列窗口乘积范围的二维区间......