Java进阶知识,包括并发编程,NIO等
BlockingQueue
BlockingQueue 是 Java 中的一个接口,它代表了一个线程安全的队列,不仅可以由多个线程并发访问,还添加了等待/通知机制,以便在队列为空时阻塞获取元素的线程,直到队列变得可用,或者在队列满时阻塞插入元素的线程,直到队列变得可用。
阻塞队列(BlockingQueue)被广泛用于“生产者-消费者”问题中,其原因是 BlockingQueue 提供了可阻塞的插入和移除方法。当队列容器已满,生产者线程会被阻塞,直到队列未满;当队列容器为空时,消费者线程会被阻塞,直至队列非空时为止。
BlockingQueue 继承了 Queue 接口,因此,BlockingQueue 也具有 Queue 接口的基本操作:
Queue接口提供方法,
插入元素
- add 将元素添加到队列尾部,如果队列满了,则抛出异常 IllegalStateException。
- offer 将元素添加到队列尾部,如果队列满了,则返回 false
删除元素
boolean remove(Object o):从队列中删除元素,成功返回true,失败返回falseE poll():检索并删除此队列的头部,如果此队列为空,则返回null
查找元素
E element():检索但不删除此队列的头部,如果队列为空时则抛出 NoSuchElementException 异常;peek():检索但不删除此队列的头部,如果此队列为空,则返回 null.
除了从 Queue 接口 继承到一些方法,BlockingQueue 自身还定义了一些其他的方法,比如说插入操作:
void put(E e):将元素添加到队列尾部,如果队列满了,则线程将阻塞直到有空间。offer(E e, long timeout, TimeUnit unit):将指定的元素插入此队列中,如果队列满了,则等待指定的时间,直到队列可用。
比如说删除操作:
take():检索并删除此队列的头部,如有必要,则等待直到队列可用;poll(long timeout, TimeUnit unit):检索并删除此队列的头部,如果需要元素变得可用,则等待指定的等待时间。
ArrayBlockingQueue
BlockingQueue 接口的实现类有 ArrayBlockingQueue、DelayQueue、LinkedBlockingDeque、LinkedBlockingQueue、LinkedTransferQueue、PriorityBlockingQueue、SynchronousQueue 等
ArrayBlockingQueue 它是一个基于数组的有界阻塞队列:
- 有界:ArrayBlockingQueue 的大小是在构造时就确定了,并且在之后不能更改。这个界限提供了流量控制,有助于资源的合理使用。
- FIFO:队列操作符合先进先出的原则。
- 当队列容量满时,尝试将元素放入队列将导致阻塞;尝试从一个空的队列取出元素也会阻塞。
