Concurrent包之BlockingQueue(阻塞式队列)

2022-10-27 16:23:02 浏览数 (1)

概述

代码语言:javascript复制
1.队列的原则:FIFO(先进先出)
2.BlockingQueue是有界限的,容量定义好之后不能改变 
3.阻塞:如果队列满了之后再往里面塞数据会阻塞,当队列为空时,则试图获取元素的操作会被阻塞。
4.BlockingQueue不允许元素为null

阻塞式队列的四个实现类

代码语言:javascript复制
ArrayBlockingQueue -- 阻塞式顺序队列
a.底层使用数组来存储数据
b.使用的时候需要指定容量  

LinkedBlockingQueue -- 阻塞式链式队列
a.底层基于节点来存储数据
b.使用的时候可以指定容量也可以不指定。如果不指定容量,则容量为
Integer.MAX_VALUE,即的次方减,这种情况下一般认为这个队列是无限的。
如果指定了容量,则容量是不可变的.

PriorityBlockingQueue -- 具有优先级的阻塞式队列
a.底层是基于数组来存储数据
b.使用的时候可以不指定容量,如果不指定容量,则默认容量为
c.要求存入的元素必须实现Comparable接口
d.在PriorityBlockingQueue中,使用迭代遍历不保证排序

SynchronousQueue -- 同步队列
. 在使用的时候不需要指定容量,容量默认为且只能为

基于ArrayBlockingQueue对相关api的实现

代码语言:javascript复制
package com.jmy.BlockingQueneDemo;

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

/*
顺序阻塞时队列 底层使用数组结构
 */
public class ArrayBlockingQueueDemo {
    public static void main(String[] args) throws InterruptedException {
        // 使用时需要指定容量
        ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>();

        // 添加元素
        queue.add("a");
        queue.offer("b");
        queue.put("c");
        // 队列现在已满
        // 使用add添加元素会抛出异常
        queue.add("d"); // Exception in thread "main" java.lang.IllegalStateException: Queue full
        // 使用offer可以获取特殊的布尔返回值
        System.out.println(queue.offer("e")); // false
        // 使用put 会产生阻塞
        queue.put("f");
        // 使用offer的重载方法可以实现定时阻塞
        queue.offer("g",, TimeUnit.SECONDS);

        // 移除元素
        System.out.println(queue.remove());
        System.out.println(queue.poll());
        System.out.println(queue.take());
        // 队列元素为空
        // 使用remove 会抛出异常
        queue.remove(); // java.util.NoSuchElementException
        // 使用poll 可以得到返回值为null
        System.out.println(queue.poll());
        // 使用take 会产生阻塞
        queue.take();
        // 使用poll的重载方法实现定时阻塞
        queue.poll(,TimeUnit.SECONDS); // 阻塞3秒


    }
}

0 人点赞