Java进阶知识

Java进阶知识,包括并发编程,NIO等

BlockingQueue

BlockingQueue 是 Java 中的一个接口,它代表了一个线程安全的队列,不仅可以由多个线程并发访问,还添加了等待/通知机制,以便在队列为空时阻塞获取元素的线程,直到队列变得可用,或者在队列满时阻塞插入元素的线程,直到队列变得可用。

阻塞队列(BlockingQueue)被广泛用于“生产者-消费者”问题中,其原因是 BlockingQueue 提供了可阻塞的插入和移除方法。当队列容器已满,生产者线程会被阻塞,直到队列未满;当队列容器为空时,消费者线程会被阻塞,直至队列非空时为止

BlockingQueue 继承了 Queue 接口,因此,BlockingQueue 也具有 Queue 接口的基本操作:

Queue接口提供方法,

插入元素

  1. add 将元素添加到队列尾部,如果队列满了,则抛出异常 IllegalStateException。
  2. offer 将元素添加到队列尾部,如果队列满了,则返回 false

删除元素

  1. boolean remove(Object o):从队列中删除元素,成功返回true,失败返回false
  2. E poll():检索并删除此队列的头部,如果此队列为空,则返回null

查找元素

  1. E element():检索但不删除此队列的头部,如果队列为空时则抛出 NoSuchElementException 异常;
  2. peek():检索但不删除此队列的头部,如果此队列为空,则返回 null.

除了从 Queue 接口 继承到一些方法,BlockingQueue 自身还定义了一些其他的方法,比如说插入操作:

  1. void put(E e):将元素添加到队列尾部,如果队列满了,则线程将阻塞直到有空间。
  2. offer(E e, long timeout, TimeUnit unit):将指定的元素插入此队列中,如果队列满了,则等待指定的时间,直到队列可用。

比如说删除操作:

  1. take()检索并删除此队列的头部,如有必要,则等待直到队列可用
  2. poll(long timeout, TimeUnit unit)检索并删除此队列的头部,如果需要元素变得可用,则等待指定的等待时间。

ArrayBlockingQueue

BlockingQueue 接口的实现类有 ArrayBlockingQueue、DelayQueue、LinkedBlockingDeque、LinkedBlockingQueue、LinkedTransferQueue、PriorityBlockingQueue、SynchronousQueue 等

ArrayBlockingQueue 它是一个基于数组的有界阻塞队列

  • 有界:ArrayBlockingQueue 的大小是在构造时就确定了,并且在之后不能更改。这个界限提供了流量控制,有助于资源的合理使用。
  • FIFO:队列操作符合先进先出的原则。
  • 当队列容量满时,尝试将元素放入队列将导致阻塞;尝试从一个空的队列取出元素也会阻塞。
-------------本文结束感谢您的阅读-------------
感谢阅读.

欢迎关注我的其它发布渠道