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 { LinkedBlockingDeque<String> queue = new LinkedBlockingDeque<String>(2); queue.add("hello"); queue.add("world"); queue.add("yes"); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } 运行结果: java.lang.IllegalStateException: Deque full at java.util.concurrent.LinkedBlockingDeque.addLast(LinkedBlockingDeque.java:289) at java.util.concurrent.LinkedBlockingDeque.add(LinkedBlockingDeque.java:582) at com.alipay.demo.trade.service.impl.hb.BlockingQueueMethodTest.main(BlockingQueueMethodTest.java:14) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
2.再来看一下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方法:
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:若队列为空,发生阻塞,等待有元素。
相关推荐
`BlockingQueue`定义了一系列常用方法,包括插入(add, offer, put, offer with timeout)、移除(remove, poll, take, poll with timeout)以及检查(element, peek)等操作。其中: - **插入操作**:向队列中添加一个...
阻塞队列(BlockingQueue)是一种特殊的队列,它支持两个附加操作:阻塞的插入方法put和阻塞的移除方法take。BlockingQueue继承了Queue接口,是Java 5中加入的。 BlockingQueue常用方法示例: 1. add(E e):添加一...
除了基本的add、remove和element方法外,它还包含以下关键方法: - `offer(E e)`: 尝试将元素插入队列,如果队列已满则返回false。 - `put(E e)`: 将元素插入队列,如果队列已满则阻塞直到有空间。 - `poll()`: ...
1. 入队操作(add(e)、offer(e)):将指定元素添加到队列中。若队列已满,offer操作会返回false,而add操作会抛出IllegalStateException。 2. 出队操作(remove()、poll()、element()、peek()):从队列中取出元素。...
- **offer(anObject)**: 类似于`add`方法,但是当队列满时不会抛出异常而是返回`false`。 - **put(anObject)**: 如果`BlockingQueue`有空间,则将`anObject`添加到队列中;如果没有空间,则调用该方法的线程将被阻塞...
3. 阻塞:如果无法立即执行,调用方线程会被阻塞,直到操作可以执行,如`put()`和`take()`。 4. 超时:如果无法立即执行,线程会等待指定时间,超时后返回,如`offer(timeout, timeunit)`和`poll(timeout, timeunit)...
Java中的`BlockingQueue`接口是Java并发编程的重要组件,它位于`...在使用时,选择合适的实现类,如`ArrayBlockingQueue`, `LinkedBlockingQueue`, `LinkedBlockingDeque`等,可以根据具体需求来优化性能和内存使用。
2. **LinkedBlockingQueue**:基于链表结构实现的无界阻塞队列,也可通过构造函数指定容量大小变为有界队列。 3. **PriorityBlockingQueue**:支持按优先级排序的无界阻塞队列。 4. **DelayQueue**:基于优先级队列...
1. **抛异常**:如 `add(element)` 方法,当队列已满时,会抛出 `IllegalStateException`。 2. **返回特定值**:如 `offer(element)` 方法,在队列满时返回 `false`。 3. **阻塞**:如 `put(element)` 方法,在队列...
3. put、take操作:put方法在队列满时阻塞,take方法在队列空时阻塞。 LinkedBlockingQueue的容量是没有上限的,但是也可以选择指定其最大容量,它是基于链表的队列,此队列按FIFO(先进先出)排序元素。 在java....
`offer()`, `put()`, `take()`等方法都是阻塞的,当队列满或空时会自动等待。 6) **死锁的产生及解决**:死锁是两个或多个线程相互等待对方释放资源导致无法继续执行的情况。避免死锁的关键是避免循环等待,例如,...
- `put(E e)`: 同`add()`,但在队列满时会阻塞直到有空位。 - **删除方法**: - `remove(Object o)`: 移除第一个匹配给定元素的项,如果找不到则返回`false`。 - `poll()`: 移除并返回队列头部的元素,队列为空...
阻塞队列提供了许多方法,例如add、offer、put、take、poll等,用于实现生产者和消费者的操作。 BlockingQueue还提供了一些其他的方法,例如remove、size、contains、drainTo等,用于对队列中的元素进行操作。 在...
对于非阻塞队列,常用的方法如`add()`、`remove()`和`offer()`等在队列满时会抛出异常,而在队列空时会返回错误值。相比之下,阻塞队列提供了更多的操作,如`put()`、`take()`、`offer(long timeout, TimeUnit unit)...
1. ThrowsException:如果无法立即执行操作,会抛出异常,例如`add()`。 2. Special Value:如果无法立即执行,返回一个特殊值,如`offer()`返回`true`或`false`。 3. Blocks:操作被阻塞,如`put()`。 4. Times Out...
2. 如果队列已满,尝试向队列中添加元素的操作(如`put()`或`offer()`)也会阻塞,直到队列中有空位。 以下是一些`BlockingQueue`的主要方法: - `add(anObject)`:尝试将元素添加到队列中,如果无法立即添加,则抛...
* add:增加一个元素,如果队列已满,则抛出一个 IllegalState Exception * remove:移除并返回队列头部的元素,如果队列为空,则抛出一个 NoSuchElementException 异常 * element:返回队列头部的元素,如果队列为...
1. `add(anObject)`: 尝试将元素anObject添加到队列中。如果队列已满,此方法会抛出`IllegalStateException`异常。 2. `offer(anObject)`: 如果队列有空间,将anObject添加到队列中,并返回true。如果队列已满,则...
当队列满时,`put()`和`offer()`方法也会阻塞,直到队列有空间。 3. **阻塞队列操作**: - `add()`:尝试将元素添加到队列的尾部,如果队列已满,则抛出`IllegalStateException`。 - `remove()`:移除并返回队列...