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)的主要内容,如果未能解决你的问题,请参考以下文章

JUC---01阻塞队列(BlockingQueue)

JavaEE & 线程案例 & 单例模式 and 阻塞队列

阻塞队列

阻塞队列

阻塞队列--概述

并发阻塞队列和非阻塞队列详解