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是一个链接节点,有三个对象字段。