Java 阻塞队列之BlockingQueue

阅读:647
作者:majingjing
发布:2021-06-08 16:37:43

Java中的BlockingQueue接口是一个线程安全的存取队列

官方原文:

A Queue that additionally supports operations that wait for the queue to become non-empty when retrieving an element, and wait for space to become available in the queue when storing an element.

翻译下来大概是这样:

  • 生产者线程会一直不断的往阻塞队列中放入数据,直到队列满了为止。队列满了后,生产者线程阻塞等待消费者线程取出数据。
  • 消费者线程会一直不断的从阻塞队列中取出数据,直到队列空了为止。队列空了后,消费者线程阻塞等待生产者线程放入数据。

BlockingQueue提供四种不同的处理方法

BlockingQueue 不接受 null 元素,否则会抛出NullPointerException

Throws exception
  • add: 插入数据时,如果阻塞队列满,那么抛出异常IllegalStateException,否则插入成功返回true
  • remove: 删除数据时,如果队列中有此数据,删除成功返回true,否则返回false。如果包含一个或者多个object,那么只移除一个就返回true
  • element: 如果队列为空,那么抛出异常NoSuchElementException。如果队列不为空,查询返回队列头部的数据,但是不移除数据
Sepcial value
  • offer: 插入数据时,如果阻塞队列没满,那么插入成功返回true,否则返回false。
  • poll: 如果队列不为空,查询、移除并返回队列头部元素。如果队列为空,那么返回null。
  • peek: 如果队列为空,返回null。如果队列不为空,查询返回队列头部的数据,但是不移除数据。
Blocks
  • put: 插入数据时,如果队列已满,那么阻塞等待队列可用。
  • take: 查询、删除并返回队列头部元素,如果队列为空,那么阻塞等待队列可用

等待期间如果被中断,那么抛出InterruptedException

Times out
  • offer: 插入数据时,如果队列已满,那么阻塞指定时间等待队列可用。如果插入成功,那么返回true,如果在达到指定时间后仍然队列不可用,那么返回false。
  • poll: 查询、删除并返回队列头部元素,如果队列为空,那么阻塞指定时间等待队列可用。如果删除成功,那么返回队列头部元素,如果在达到指定时间后仍然队列不可用,那么返回null

已知的所有实现类


Reference: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/BlockingQueue.html