最近在学习<<Java并发编程实践>>,有很多java.util.concurrent包下的新类。LinkedBlockingQueue就是其中之一,顾名思义这是一个阻塞的线程安全的队列,底层应该采用链表实现。
看其API的时候发现,添加元素的方法竟然有三个:add,put,offer。
且这三个元素都是向队列尾部添加元素的意思。于是我产生了兴趣,要仔细探究一下他们之间的差别。
1.首先看一下add方法:
Inserts the specified element into this queue if it is possible to do so immediately without violating capacity restrictions, returning true upon success and throwing an IllegalStateException if no space is currently available. This implementation returns true if offer succeeds, else throws an IllegalStateException.
LinkedBlockingQueue构造的时候若没有指定大小,则默认大小为Integer.MAX_VALUE,当然也可以在构造函数的参数中指定大小。LinkedBlockingQueue不接受null。
add方法在添加元素的时候,若超出了度列的长度会直接抛出异常:
public static void main(String args[]){ try { LinkedBlockingQueue<String> queue=new LinkedBlockingQueue(2); queue.add("hello"); queue.add("world"); queue.add("yes"); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } //运行结果: java.lang.IllegalStateException: Queue full at java.util.AbstractQueue.add(Unknown Source) at com.wjy.test.GrandPather.main(GrandPather.java:12)
2.再来看一下put方法:
Inserts the specified element at the tail of this queue, waiting if necessary for space to become available.
对于put方法,若向队尾添加元素的时候发现队列已经满了会发生阻塞一直等待空间,以加入元素。
public static void main(String args[]){ try { LinkedBlockingQueue<String> queue=new LinkedBlockingQueue(2); queue.put("hello"); queue.put("world"); queue.put("yes"); System.out.println("yes"); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } //运行结果: //在queue.put("yes")处发生阻塞 //下面的“yes”无法输出
3.最后看一下offer方法:
Inserts the specified element at the tail of this queue if it is possible to do so immediately without exceeding the queue's capacity, returning true upon success and false if this queue is full. When using a capacity-restricted queue, this method is generally preferable to method add, which can fail to insert an element only by throwing an exception.
offer方法在添加元素时,如果发现队列已满无法添加的话,会直接返回false。
public static void main(String args[]){ try { LinkedBlockingQueue<String> queue=new LinkedBlockingQueue(2); boolean bol1=queue.offer("hello"); boolean bol2=queue.offer("world"); boolean bol3=queue.offer("yes"); System.out.println(queue.toString()); System.out.println(bol1); System.out.println(bol2); System.out.println(bol3); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } //运行结果: [hello, world] true true false
好了,竟然说了这么多了,就把从队列中取元素的方法也顺便一说。
从队列中取出并移除头元素的方法有:poll,remove,take。
poll: 若队列为空,返回null。
remove:若队列为空,抛出NoSuchElementException异常。
take:若队列为空,发生阻塞,等待有元素。
相关推荐
3. 阻塞:如果无法立即执行,调用方线程会被阻塞,直到操作可以执行,如`put()`和`take()`。 4. 超时:如果无法立即执行,线程会等待指定时间,超时后返回,如`offer(timeout, timeunit)`和`poll(timeout, timeunit)...
除了基本的add、remove和element方法外,它还包含以下关键方法: - `offer(E e)`: 尝试将元素插入队列,如果队列已满则返回false。 - `put(E e)`: 将元素插入队列,如果队列已满则阻塞直到有空间。 - `poll()`: ...
阻塞队列(BlockingQueue)是一种特殊的队列,它支持两个附加操作:阻塞的插入方法put和阻塞的移除方法take。BlockingQueue继承了Queue接口,是Java 5中加入的。 BlockingQueue常用方法示例: 1. add(E e):添加一...
1. 入队操作(add(e)、offer(e)):将指定元素添加到队列中。若队列已满,offer操作会返回false,而add操作会抛出IllegalStateException。 2. 出队操作(remove()、poll()、element()、peek()):从队列中取出元素。...
`BlockingQueue`定义了一系列常用方法,包括插入(add, offer, put, offer with timeout)、移除(remove, poll, take, poll with timeout)以及检查(element, peek)等操作。其中: - **插入操作**:向队列中添加一个...
Java中的`BlockingQueue`接口是Java并发编程的重要组件,它位于`...在使用时,选择合适的实现类,如`ArrayBlockingQueue`, `LinkedBlockingQueue`, `LinkedBlockingDeque`等,可以根据具体需求来优化性能和内存使用。
3. **阻塞**:如`put(e)`和`take()`,队列满或空时线程被阻塞,直到队列状态改变。 4. **阻塞特定时间**:如`offer(e, time, unit)`和`poll(time, unit)`,如果在指定时间内队列状态没有改变,则线程恢复执行。 ###...
- **offer(anObject)**: 类似于`add`方法,但是当队列满时不会抛出异常而是返回`false`。 - **put(anObject)**: 如果`BlockingQueue`有空间,则将`anObject`添加到队列中;如果没有空间,则调用该方法的线程将被阻塞...
通过 `put` 和 `take` 方法,生产者和消费者可以有效地协作,即使队列满了或者空了也不会导致程序崩溃。 #### 四、总结 `java.util.concurrent` 包中的 `BlockingQueue` 接口为实现生产者-消费者模型提供了一种...
对于非阻塞队列,常用的方法如`add()`、`remove()`和`offer()`等在队列满时会抛出异常,而在队列空时会返回错误值。相比之下,阻塞队列提供了更多的操作,如`put()`、`take()`、`offer(long timeout, TimeUnit unit)...
阻塞队列提供了许多方法,例如add、offer、put、take、poll等,用于实现生产者和消费者的操作。 BlockingQueue还提供了一些其他的方法,例如remove、size、contains、drainTo等,用于对队列中的元素进行操作。 在...
3. put、take操作:put方法在队列满时阻塞,take方法在队列空时阻塞。 LinkedBlockingQueue的容量是没有上限的,但是也可以选择指定其最大容量,它是基于链表的队列,此队列按FIFO(先进先出)排序元素。 在java....
- `put(E e)`: 同`add()`,但在队列满时会阻塞直到有空位。 - **删除方法**: - `remove(Object o)`: 移除第一个匹配给定元素的项,如果找不到则返回`false`。 - `poll()`: 移除并返回队列头部的元素,队列为空...
`offer()`, `put()`, `take()`等方法都是阻塞的,当队列满或空时会自动等待。 6) **死锁的产生及解决**:死锁是两个或多个线程相互等待对方释放资源导致无法继续执行的情况。避免死锁的关键是避免循环等待,例如,...
1. ThrowsException:如果无法立即执行操作,会抛出异常,例如`add()`。 2. Special Value:如果无法立即执行,返回一个特殊值,如`offer()`返回`true`或`false`。 3. Blocks:操作被阻塞,如`put()`。 4. Times Out...
当队列满时,`put()`和`offer()`方法也会阻塞,直到队列有空间。 3. **阻塞队列操作**: - `add()`:尝试将元素添加到队列的尾部,如果队列已满,则抛出`IllegalStateException`。 - `remove()`:移除并返回队列...
2. 如果队列已满,尝试向队列中添加元素的操作(如`put()`或`offer()`)也会阻塞,直到队列中有空位。 以下是一些`BlockingQueue`的主要方法: - `add(anObject)`:尝试将元素添加到队列中,如果无法立即添加,则抛...
Java中的阻塞队列BlockingQueue是一种并发编程中常用的工具,它实现了线程间的同步和通信。阻塞队列的核心特性在于当队列为空时,尝试获取元素的线程会被阻塞,直到其他线程添加元素;当队列满时,尝试添加元素的...
* RejectedExecutionHandler:饱和策略,最大线程和工作队列容量且已经饱和时 execute 方法都将调用 RejectedExecutionHandler ThreadPoolExecutor 的工作流程 ThreadPoolExecutor 的工作流程可以分为以下四步: ...