1.什么是阻塞队列

java线程阻塞状态会占用资源吗_java线程阻塞状态会占用资源吗

 

阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。

2.阻塞队列的类型

  • ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。
  • LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。
  • PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。
  • DelayQueue:一个使用优先级队列实现的无界阻塞队列。
  • SynchronousQueue:一个不存储元素的阻塞队列。
  • LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
  • LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。

阻塞队列有七种,但是常用的只有三种,使用LinkedBlockingQueue需要注意的是创建的时候要设置大小,否则默认是Integer.MAX_VALUE

3.阻塞队列的优点

1)可以灵活地控制多线程并发:使用阻塞队列可以灵活地控制线程之间的同步交互,而不需要许多复杂的同步机制。

2)吞吐量优化:阻塞队列可以有效地提高任务的执行速度和效率,从而提高整体的吞吐量。

3)消息传递:它还可以帮助线程之间传递消息,简化任务执行流程。

4)4.简化编程∶它可以帮助编译器正确的编译程序,从而简化程序的编写过程。

5)5.可靠性高︰它可以有效减少应用程序出现内存溢出等错误的可能性,这样可以提高呈序的可靠性和安全性。

4.阻塞队列的核心方法

方法类型

抛出异常

特殊值

阻塞

超时

插入

add(e)

offer(e)

put(e)

offer(e,time,unit)

移除

remove

poll()

take()

poll(time,unit)

检查

element()

peek()

  1. 抛异常:如果试图的操作无法立即执行,抛一个异常。
  2. 特定值:如果试图的操作无法立即执行,返回一个特定的值(常常是 true / false)。
  3. 阻塞:如果试图的操作无法立即执行,该方法调用将会发生阻塞,直到能够执行。
  4. 超时:如果试图的操作无法立即执行,该方法调用将会发生阻塞,直到能够执行,但等待时间不会超过给定值。返回一个特定值以告知该操作是否成功(典型的是true / false)。

5.阻塞队列的原理

其实阻塞队列实现阻塞同步的方式很简单,使用的就是是lock锁的多条件(condition)阻塞控制。使用BlockingQueue封装了根据条件阻塞线程的过程,而我们就不用关心繁琐的await/signal操作了。