作者:白小蛮 | 来源:互联网 | 2023-10-10 12:02
一、什么是阻塞队列阻塞队列是一个队列,在数据结构中起的作用如上图;当队列是空的,从队列中获取元素的操作将会被阻塞;当队列是满的,从队列中添加元素的操作将会被阻塞1.为什么需要Blo
一、什么是阻塞队列
阻塞队列是一个队列,在数据结构中起的作用如上图;当队列是空的,从队列中获取元素的操作将会被阻塞;当队列是满的,从队列中添加元素的操作将会被阻塞
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 abq = new ArrayBlockingQueue(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 abq = new ArrayBlockingQueue(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 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 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)