`

LinkedBlockingQueue的put,add跟offer的区别

阅读更多

1.首先看一下add方法:

  1. 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.   
  2. 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方法:

  1. Inserts the specified element at the tail of this queue, waiting if necessary for space to become available.  

 

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方法:

 

  1. 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.  

 

 

 

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:若队列为空,发生阻塞,等待有元素。

分享到:
评论

相关推荐

    线程安全队列Queue

    `BlockingQueue`定义了一系列常用方法,包括插入(add, offer, put, offer with timeout)、移除(remove, poll, take, poll with timeout)以及检查(element, peek)等操作。其中: - **插入操作**:向队列中添加一个...

    14-阻塞队列BlockingQueue实战及其原理分析二.pdf

    阻塞队列(BlockingQueue)是一种特殊的队列,它支持两个附加操作:阻塞的插入方法put和阻塞的移除方法take。BlockingQueue继承了Queue接口,是Java 5中加入的。 BlockingQueue常用方法示例: 1. add(E e):添加一...

    BlockQueue练习

    除了基本的add、remove和element方法外,它还包含以下关键方法: - `offer(E e)`: 尝试将元素插入队列,如果队列已满则返回false。 - `put(E e)`: 将元素插入队列,如果队列已满则阻塞直到有空间。 - `poll()`: ...

    阻塞队列(Blocking Queue)是一个支持两个附加操作的队列.txt

    1. 入队操作(add(e)、offer(e)):将指定元素添加到队列中。若队列已满,offer操作会返回false,而add操作会抛出IllegalStateException。 2. 出队操作(remove()、poll()、element()、peek()):从队列中取出元素。...

    线程----BlockingQueue

    - **offer(anObject)**: 类似于`add`方法,但是当队列满时不会抛出异常而是返回`false`。 - **put(anObject)**: 如果`BlockingQueue`有空间,则将`anObject`添加到队列中;如果没有空间,则调用该方法的线程将被阻塞...

    JUC并发包开发手册.docx

    3. 阻塞:如果无法立即执行,调用方线程会被阻塞,直到操作可以执行,如`put()`和`take()`。 4. 超时:如果无法立即执行,线程会等待指定时间,超时后返回,如`offer(timeout, timeunit)`和`poll(timeout, timeunit)...

    Java 多线程与并发(16-26)-JUC集合- BlockingQueue详解.pdf

    Java中的`BlockingQueue`接口是Java并发编程的重要组件,它位于`...在使用时,选择合适的实现类,如`ArrayBlockingQueue`, `LinkedBlockingQueue`, `LinkedBlockingDeque`等,可以根据具体需求来优化性能和内存使用。

    10、阻塞队列BlockingQueue实战及其原理分析.pdf

    2. **LinkedBlockingQueue**:基于链表结构实现的无界阻塞队列,也可通过构造函数指定容量大小变为有界队列。 3. **PriorityBlockingQueue**:支持按优先级排序的无界阻塞队列。 4. **DelayQueue**:基于优先级队列...

    java并发工具包 java.util.concurrent中文版pdf

    1. **抛异常**:如 `add(element)` 方法,当队列已满时,会抛出 `IllegalStateException`。 2. **返回特定值**:如 `offer(element)` 方法,在队列满时返回 `false`。 3. **阻塞**:如 `put(element)` 方法,在队列...

    java队列之queue用法实例分析

    3. put、take操作:put方法在队列满时阻塞,take方法在队列空时阻塞。 LinkedBlockingQueue的容量是没有上限的,但是也可以选择指定其最大容量,它是基于链表的队列,此队列按FIFO(先进先出)排序元素。 在java....

    并发编程面试专题.pdf

    `offer()`, `put()`, `take()`等方法都是阻塞的,当队列满或空时会自动等待。 6) **死锁的产生及解决**:死锁是两个或多个线程相互等待对方释放资源导致无法继续执行的情况。避免死锁的关键是避免循环等待,例如,...

    Java使用阻塞队列控制线程通信的方法实例详解

    - `put(E e)`: 同`add()`,但在队列满时会阻塞直到有空位。 - **删除方法**: - `remove(Object o)`: 移除第一个匹配给定元素的项,如果找不到则返回`false`。 - `poll()`: 移除并返回队列头部的元素,队列为空...

    详解java中的阻塞队列

    阻塞队列提供了许多方法,例如add、offer、put、take、poll等,用于实现生产者和消费者的操作。 BlockingQueue还提供了一些其他的方法,例如remove、size、contains、drainTo等,用于对队列中的元素进行操作。 在...

    剖析Java中阻塞队列的实现原理及应用场景

    对于非阻塞队列,常用的方法如`add()`、`remove()`和`offer()`等在队列满时会抛出异常,而在队列空时会返回错误值。相比之下,阻塞队列提供了更多的操作,如`put()`、`take()`、`offer(long timeout, TimeUnit unit)...

    Java并发之BlockingQueue的使用

    1. ThrowsException:如果无法立即执行操作,会抛出异常,例如`add()`。 2. Special Value:如果无法立即执行,返回一个特殊值,如`offer()`返回`true`或`false`。 3. Blocks:操作被阻塞,如`put()`。 4. Times Out...

    java线程并发blockingqueue类使用示例

    2. 如果队列已满,尝试向队列中添加元素的操作(如`put()`或`offer()`)也会阻塞,直到队列中有空位。 以下是一些`BlockingQueue`的主要方法: - `add(anObject)`:尝试将元素添加到队列中,如果无法立即添加,则抛...

    java中ThreadPoolExecutor常识汇总

    * add:增加一个元素,如果队列已满,则抛出一个 IllegalState Exception * remove:移除并返回队列头部的元素,如果队列为空,则抛出一个 NoSuchElementException 异常 * element:返回队列头部的元素,如果队列为...

    java 中 阻塞队列BlockingQueue详解及实例

    1. `add(anObject)`: 尝试将元素anObject添加到队列中。如果队列已满,此方法会抛出`IllegalStateException`异常。 2. `offer(anObject)`: 如果队列有空间,将anObject添加到队列中,并返回true。如果队列已满,则...

    java中queue接口的使用详解

    当队列满时,`put()`和`offer()`方法也会阻塞,直到队列有空间。 3. **阻塞队列操作**: - `add()`:尝试将元素添加到队列的尾部,如果队列已满,则抛出`IllegalStateException`。 - `remove()`:移除并返回队列...

Global site tag (gtag.js) - Google Analytics