JUC---01阻塞队列(BlockingQueue)
Posted jenne-blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JUC---01阻塞队列(BlockingQueue)相关的知识,希望对你有一定的参考价值。
一、什么是阻塞队列
阻塞队列是一个队列,在数据结构中起的作用如上图;当队列是空的,从队列中获取元素的操作将会被阻塞;当队列是满的,从队列中添加元素的操作将会被阻塞
1.为什么需要BlockingQueue:
好处是我们不需要关心什么时候需要阻塞线程,什么时候需要唤醒线程,因为这一切BlockingQueue都给你一手包办了
二、阻塞队列分类
ArrayBlockingQueue: 由数组结构组成的有界阻塞队列。*
LinkedBlockingQueue: 由链表结构组成的有界(但大小默认值为integer.MAX_VALUE)阻塞队列。*
PriorityBlockingQueue: 支持优先级排序的无界阻塞队列。
DelayQueue: 使用优先级队列实现的延迟无界阻塞队列。
SynchronousQueue: 不存储元素的阻塞队列,也即单个元素的队列。*
LinkedTransferQueue: 由链表组成的无界阻塞队列。
LinkedBlockingDeque: 由链表组成的双向阻塞队列。
三、核心方法
四、代码
1 package com.jenne.mydemo; 2 3 import org.junit.jupiter.api.Test; 4 5 import java.util.concurrent.ArrayBlockingQueue; 6 import java.util.concurrent.BlockingQueue; 7 import java.util.concurrent.TimeUnit; 8 9 /* 10 ArrayBlockingQueue: 由数组结构组成的有界阻塞队列。* 11 LinkedBlockingQueue: 由链表结构组成的有界(但大小默认值为integer.MAX_VALUE)阻塞队列。* 12 PriorityBlockingQueue: 支持优先级排序的无界阻塞队列。 13 DelayQueue: 使用优先级队列实现的延迟无界阻塞队列。 14 SynchronousQueue: 不存储元素的阻塞队列,也即单个元素的队列。* 15 LinkedTransferQueue: 由链表组成的无界阻塞队列。 16 LinkedBlockingDeque: 由链表组成的双向阻塞队列。 17 */ 18 public class TestBlockingQueue { 19 @Test 20 public void testArrayBlockingQueue01() { 21 //创建一个ArrayBlockingQueue具有给定(固定)容量 22 ArrayBlockingQueue<String> abq = new ArrayBlockingQueue<String>(3); 23 24 System.out.println(abq.add("a")); 25 System.out.println(abq.add("b")); 26 System.out.println(abq.add("c")); 27 //System.out.println(abq.add("d"));//出现 java.lang.IllegalStateException: Queue full 异常 28 29 System.out.println(abq.remove()); 30 System.out.println(abq.remove()); 31 System.out.println(abq.remove()); 32 //System.out.println(abq.remove());//出现 java.util.NoSuchElementException 异常 33 } 34 35 @Test 36 public void testArrayBlockingQueue02() { 37 //创建一个ArrayBlockingQueue具有给定(固定)容量 38 ArrayBlockingQueue<String> abq = new ArrayBlockingQueue<String>(3); 39 40 System.out.println(abq.offer("a")); 41 System.out.println(abq.offer("b")); 42 System.out.println(abq.offer("c")); 43 //System.out.println(abq.offer("d"));//超过了给定容量,返回false 44 45 System.out.println(abq.poll()); 46 System.out.println(abq.poll()); 47 System.out.println(abq.poll()); 48 //System.out.println(abq.poll());//超过了给定容量,返回null 49 } 50 51 @Test 52 public void testArrayBlockingQueue03() throws InterruptedException { 53 //创建一个ArrayBlockingQueue具有给定(固定)容量 54 BlockingQueue<String> abq = new ArrayBlockingQueue(3); 55 56 abq.put("a"); 57 abq.put("b"); 58 abq.put("c"); 59 //abq.put("x");//使程序一直阻塞,无法停止 60 System.out.println(abq.take()); 61 System.out.println(abq.take()); 62 System.out.println(abq.take()); 63 //System.out.println(abq.take());//使程序一直阻塞,无法停止 64 } 65 66 @Test 67 public void testArrayBlockingQueue04() throws InterruptedException { 68 //创建一个ArrayBlockingQueue具有给定(固定)容量 69 BlockingQueue<String> abq = new ArrayBlockingQueue(3); 70 71 System.out.println(abq.offer("a")); 72 System.out.println(abq.offer("b")); 73 System.out.println(abq.offer("c")); 74 //System.out.println(abq.offer("d"));//超过了给定容量,返回false 75 76 System.out.println(abq.poll()); 77 System.out.println(abq.poll()); 78 System.out.println(abq.poll()); 79 //System.out.println(abq.poll(4, TimeUnit.SECONDS));//4s后获取数据,但是超过了给定容量,返回null 80 } 81 }
以上是关于JUC---01阻塞队列(BlockingQueue)的主要内容,如果未能解决你的问题,请参考以下文章