ArrayBlockingQueue和LinkedBlockingQueue的区别
admin
2023-07-30 20:18:53
0

Java集合中的ArrayBlockingQueueLinkedBlockingQueueBlockingQueue接口的常见实现。

ArrayBlockingQueue

ArrayBlockingQueue是Java中实现BlockingQueue接口的一个类。ArrayBlockingQueue类和它的迭代器实现了Collection和Iterator接口的所有可选方法。ArrayBlockingQueue是一个有边界的BlockingQueue,由一个数组支持。这里,有界意味着队列的大小是有限的和固定的。一旦创建,我们就不能扩大或缩小队列的大小。如果我们试图在一个满的队列中插入一个元素,那么它将导致操作阻塞。同样地,如果我们试图从一个空队列中取出一个元素,那么操作也会被阻塞。ArrayBlockingQueue内部以FIFO(先进先出)的顺序存储队列中的元素。位于队列头部或前端的元素是这个队列中所有元素中最古老的元素。队列尾部的元素是这个队列中所有元素中最新的元素。新的元素总是在队列的末端或尾部插入,而检索操作则在队列的头部获得元素。

LinkedBlockingQueue

LinkedBlockingQueue是Java中一个实现BlockingQueue接口的类。LinkedBlockingQueue是一个由链接节点支持的可选边界的BlockingQueue。这里,可选的约束意味着给LinkedBlockingQueue的容量是有约束的,否则,它将是无约束的。容量可以作为参数给到LinkedBlockingQueue的构造函数。如果没有指定的话,容量等于Integer.MAX_VALUE。LinkedBlockingQueue类和它的迭代器实现了Collection和Iterator接口的所有可选方法。LinkedBlockingQueue按照FIFO(先进先出)的顺序在内部存储队列中的元素。位于队列头部或前端的元素是这个队列中所有元素中最古老的元素。在队列尾部的元素是这个队列中所有元素中最新的元素。新的元素总是在队列的末端或尾部插入,而检索操作则在队列的头部获得元素。链接队列通常比基于数组的队列有更高的吞吐量,但在大多数并发应用中的性能不那么可预测。

链接阻塞队列示例代码:

// Java program to demonstrate LinkedBlockingQueue

import java.util.concurrent.LinkedBlockingQueue;

public class LinkedBlockingQueueDemo {

    public static void main(String[] args)
    {
        // define capacity of LinkedBlockingQueue
        int capacity = 15;

        // create object of LinkedBlockingQueue
        LinkedBlockingQueue lbq = new LinkedBlockingQueue(capacity);

        // add numbers
        lbq.add(1);
        lbq.add(2);
        lbq.add(3);

        // print queue
        System.out.println("LinkedBlockingQueue:" + lbq);
    }
}

ArrayBlockingQueue示例:

// Java program to demonstrate
// ArrayBlockingQueue

import java.util.concurrent.ArrayBlockingQueue;

public class ArrayBlockingQueueDemo {

    public static void main(String[] args)
    {
        // define capacity of ArrayBlockingQueue
        int capacity = 15;

        ArrayBlockingQueue abq = new ArrayBlockingQueue(capacity);

        // add numbers
        abq.add(1);
        abq.add(2);
        abq.add(3);

        // print queue
        System.out.println("ArrayBlockingQueue:" + abq);
    }
}

ArrayBlockingQueue和LinkedBlockingQueue之间的区别 –

ArrayBlockingQueue 链接阻塞队列(LinkedBlockingQueen)
ArrayBlockingQueue在内部将元素存储在一个数组中。 LinkedBlockingQueen在内部将元素存储在链接节点中。
ArrayBlockingQueue是有界的,这意味着它的大小在创建后不会改变。 LinkedBlockingQueue是有边界的,这意味着如果需要的话,它可以选择有一个上限。如果没有指定上界,Integer.MAX_VALUE被用作上界。
ArrayBlockingQueue的吞吐量比链接节点队列低。 它的吞吐量比基于数组的队列高。
ArrayBlockingQueue使用单锁双条件算法。它意味着生产者和消费者共享一个锁。 LinkedBlockingQueen使用两个锁队列算法,它有两个锁条件putLock和takeLock,分别用于从队列中插入和删除元素。
ArrayBlockingQueue总是持有一个对象数组 LinkedBlockingQueue是一个链接节点,有三个对象字段。

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
项目管理和工程管理的区别 项目管理 项目管理,顾名思义就是专注于开发和完成项目的管理,以实现目标并满足成功标准和项目要求。 工...