# 常用阻塞队列 BlockingQueue 有哪些？

## 常用的阻塞队列

offer(e)

put(e)

offer(e,time,unit)

remove()

poll()

take()

poll(time,unit)

1）ArrayBlockingQueue

file

3） SynchronousQueue

4）PriorityBlockingQueue

PriorityBlockingQueue 是基于二叉树最小堆实现的，每当取元素的时候，就会把优先级最高的元素取出来。我们测试一下：

```public class Person {
private int id;
private String name;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}

public Person(int id, String name) {
this.id = id;
this.name = name;
}

public Person() {
}
}

public class QueueTest {
public static void main(String[] args) throws InterruptedException {

PriorityBlockingQueue<Person> priorityBlockingQueue = new PriorityBlockingQueue<>(1, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getId() - o2.getId();
}
});

Person p2 = new Person(7, "李四");
Person p1 = new Person(9, "张三");
Person p3 = new Person(6, "王五");
Person p4 = new Person(2, "赵六");

//由于二叉树最小堆实现，用这种方式直接打印元素，不能保证有序
System.out.println(priorityBlockingQueue);
System.out.println(priorityBlockingQueue.take());
System.out.println(priorityBlockingQueue);
System.out.println(priorityBlockingQueue.take());
System.out.println(priorityBlockingQueue);

}
}
```

```[Person{id=2, name='赵六'}, Person{id=6, name='王五'}, Person{id=7, name='李四'}, Person{id=9, name='张三'}]
Person{id=2, name='赵六'}
[Person{id=6, name='王五'}, Person{id=9, name='张三'}, Person{id=7, name='李四'}]
Person{id=6, name='王五'}
[Person{id=7, name='李四'}, Person{id=9, name='张三'}]
```

5）DelayQueue

```public class DelayData implements Delayed {

private int id;
private String name;
//数据到期时间
private long endTime;
private TimeUnit timeUnit = TimeUnit.MILLISECONDS;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public long getEndTime() {
return endTime;
}

public void setEndTime(long endTime) {
this.endTime = endTime;
}

public DelayData(int id, String name, long endTime) {
this.id = id;
this.name = name;
//需要把传入的时间endTime 加上当前系统时间，作为数据的到期时间
this.endTime = endTime + System.currentTimeMillis();
}

public DelayData() {
}

@Override
public long getDelay(TimeUnit unit) {
return this.endTime - System.currentTimeMillis();
}

@Override
public int compareTo(Delayed o) {
return o.getDelay(this.timeUnit) - this.getDelay(this.timeUnit) < 0 ? 1: -1;
}

}

```

```public class ProcessData {
public static void main(String[] args) throws InterruptedException {
DelayQueue<DelayData> delayQueue = new DelayQueue<>();

DelayData a = new DelayData(5, "A", 5000);
DelayData b = new DelayData(8, "B", 8000);
DelayData c = new DelayData(2, "C", 2000);

System.out.println("开始计时时间:" + System.currentTimeMillis());
for (int i = 0; i < 3; i++) {
DelayData data = delayQueue.take();
System.out.println("id:"+data.getId()+"，数据:"+data.getName()+"被移除，当前时间:"+System.currentTimeMillis());
}
}
}
```

```开始计时时间:1583333583216
id:2，数据:C被移除，当前时间:1583333585216
id:5，数据:A被移除，当前时间:1583333588216
id:8，数据:B被移除，当前时间:1583333591216
```

0 条评论

• ### juc02 阻塞队列—BlockingQueue

java的阻塞队列接口，java.util.concurrent.BlockingQueue，在添加、获取元素时是线程安全的。换句话说，多线程可以安全的从一个B...

• ### 干货 | 45张图庖丁解牛18种Queue，你知道几种？

在讲《21张图讲解集合的线程不安全》那一篇，我留了一个彩蛋，就是Queue（队列）还没有讲，这次我们重点来看看Java中的Queue家族，总共涉及到18种Que...

• ### 快速掌握并发编程---ArrayBlockingQueue 底层原理和实战

在JDK1.5的时候，在新增的Concurrent包中，BlockingQueue很好的解决了多线程中，如何高效安全“传输”数据的问题。通过这些高效并且线程安全...

• ### java高并发系列 - 第25天：掌握JUC中的阻塞队列

（2）如果操作失败，则返回特殊值（null或false，具体取决于操作），接口的常规结构如下表所示。

• ### 阻塞队列 BlockingQueue 我也不会啊

为了应对不同的业务场景，BlockingQueue 提供了4 组不同的方法用于插入、移除以及对队列中的元素进行检查。如果请求的操作不能得到立即执行的话，每组方法...

• ### BlockingQueue

前言： 在新增的Concurrent包中，BlockingQueue很好的解决了多线程中，如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队...

• ### 阻塞队列 BlockingQueue

阻塞队列，英文名BlockingQueue，顾名思义，首先它是一个队列。阻塞就是说在多线程环境下，线程在某些情况下会被挂起，这就是阻塞，一旦满足条件，又会被唤醒...

• ### BlockingQueue队列

阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构，BlockingQueue提供了线程安全的...

• ### Java 7 种阻塞队列详解

队列（Queue）是一种经常使用的集合。Queue 实际上是实现了一个先进先出（FIFO：First In First Out）的有序表。和 List、Set ...

• ### 1.1w字，10图彻底掌握阻塞队列（并发必备）

队列是一种 先进先出的特殊线性表，简称 FIFO。特殊之处在于只允许在一端插入，在另一端删除

• ### Java多线程高并发学习笔记——阻塞队列

在探讨可重入锁之后，接下来学习阻塞队列，这篇文章也是断断续续的写了很久，因为最近开始学ssm框架，准备做一个自己的小网站，后续可能更新自己写网站的技术分享。 请...

• ### Java多线程高并发学习笔记——阻塞队列

在探讨可重入锁之后，接下来学习阻塞队列，这篇文章也是断断续续的写了很久，因为最近开始学ssm框架，准备做一个自己的小网站，后续可能更新自己写网站的技术分享。

• ### java并发编程工具类JUC之一：BlockingQueue阻塞队列

Java BlockingQueue接口java.util.concurrent.BlockingQueue表示一个可以存取元素，并且线程安全的队列。换句话说，...

在新增的Concurrent包中，BlockingQueue很好的解决了多线程中，如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类，为我们快速搭...

• ### 关于线程池你不得不知道的一些设置

看完我上一篇文章「你都理解创建线程池的参数吗？」之后，当遇到这种问题，你觉得你完全能够唬住面试官了，50k轻松到手。殊不知，要是面试官此刻给你来个反杀：

• ### 并发工具箱 concurrent包的原理分析以及使用

BlockingQueue 通常用于一个线程生产对象，而另外一个线程消费这些对象的场景。下图是对这个原理的阐述：

• ### ArrayBlockingQueue

上一篇我们手写了一个阻塞队列，今天我们接着开始学习之旅，让我们一起来看看ArrayBlockingQueue的源码吧。ArrayBlockingQueue是JD...