总结: ArrayBlockingQueue应该是最简单的阻塞队列实现了,由于数组结构的特殊性,使用了一把锁和2个条件队列,锁的方式是可中断锁。 三、LinkedBlockingQueue 使用链表实现队列,构造器使用方式和ArrayBlockingQueue一样 public LinkedBlockingQueue(int capacity) { if (capacity <= 0) throw new IllegalArgumentException()...
BlockingQueue 是个接口,需要使用它的实现之一来使用 BlockingQueue,java.util.concurrent包下具有以下 BlockingQueue 接口的实现类: JDK 提供了 7 个阻塞队列。分别是 ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列 LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列 PriorityBlockingQueue:一个支持优先级排序...
put(anObject):把anObject加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里面有空间再继续. 获取数据: poll(time):取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间, 取不到时返回null; poll(long timeout, TimeUnit unit):从BlockingQueue取出...
我们常用的LinkedList就实现了Queue接口,具有了offer()、poll()等操作。但是,LinkedList是线程不安全的,只使用于单线程操作。如果要实现一个线程安全的队列,一般有两种方式:一是使用阻塞算法,给读写操作加锁;二是使用非阻塞算法,通过循环CAS的方式来实现。本篇文章的ConcurrentLinkedQueue就是并发大师Doug Lea设计的一...
Queue是单端队列,只能从一端插入元素,另一端删除元素,实现上一般遵循 先进先出(FIFO) 规则。 Queue 接口抛出异常返回特殊值 插入队尾add(E e)offer(E e) 删除队首remove()poll() 查询队首元素element()peek() Deque是双端队列,在队列的两端均可以插入或删除元素。
LinkedBlockingQueue 基于链表实现的阻塞队列,默认是无界队列,创建可以指定容量大小 SynchronousQueue 一种没...
当容量满时要让生产者线程阻塞等待,当队列里没消息时让消费者线程阻塞等待。 阻塞队列用来平衡消费者和生产者 二、自定义简单的阻塞队列 2.1 使用synchronized和wait notify实现阻塞队列 我们先使用synchronized和wait notify来实现一个简单的阻塞队列。 // 自定义阻塞队列@Slf4jpublicclassMyBolckQueue<T> {//使用Link...
LinkedBlockingQueue和ArrayBlockingQueue的区别是什么? 1. LinkedBlockingQueue 上篇中,说到了ArrayBlockingQueue阻塞队列。在ArrayBlockingQueue中,底层使用了数组结构来实现。 那么,提到数组了就不得不提及链表。作为两对成双成对的老冤家,链表也可以实现阻塞队列。 下面,就让我们进入今天的正题LinkedBlockingQueue!!! Li...
poll poll方法对应上面remove方法,两者的区别就在于是否会在无元素情况下抛出异常,poll方法在无元素时不会抛出异常而是返回null,如下代码: private static void groupPoll() {BlockingQueue queue = new ArrayBlockingQueue(2);System.out.println(queue.offer("云栖简码")); //添加元素System.out.println(queue.pol...
1. ArrayBlockingQueue ArrayBlockingQueue是一个有界的阻塞队列,底层是由数组实现的,当队列满时,新元素将无法添加到队列中,直到队列中有空闲位置为止。当队列为空时,获取元素的操作将会阻塞,直到队列中有元素可用。2. LinkedBlockingQueue LinkedBlockingQueue是一个无界的阻塞队列,底层是由链表实现的,可以存储...