LinkedBlockingQueue的put,add跟offer的区别(转)

LinkedBlockingQueue的put,add和offer的区别 

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

http://www.soso.io/article/66762.html

时间: 2024-09-15 13:49:49

LinkedBlockingQueue的put,add跟offer的区别(转)的相关文章

在 VS 类库项目中 Add Service References 和 Add Web References 的区别

原文:在 VS 类库项目中 Add Service References 和 Add Web References 的区别 出身问题: 1.在vs2005时代,Add Web Reference(添加Web服务引用)的功能主要是添加Web Service引用.基于.NET Framework 2.0. 2.自VS2008以后,为了对.NET Framework 3.0 或 3.5版本上WCF Service Library的支持.增加了Add Service Reference(添加服务引用)功

MyEclipse中add jars和add external jars的区别带来的svn checkout的问题

一.发现问题项目中缺少一个包,将该包copy到lib文件夹中,没有自动引用.使用add external jars引用上.别人通过svn来check out我的项目,该包引用不上.   二.思考过程add jars是表示从该工程里添加包,前提是把jar已经放到该工程目录中而add external jars表示这个jar的位置需要URI来定位,需要给出全路径.   三.解决问题add jars已经放到lib中的包即可,别人通过svn check out也木有问题了.  

Java容器类型学习笔记

最近抽空把java.lang下面常用的那些容器类型(数据结构)复习了一下,这些东西是基础,平时使用的时候也可以很容易查得到,有些方法大概知道,但是总是弄混,如果可以记住那些重要方法,并且能够熟练使用的话,还是可以让编码过程变得容易很多.另外一个是实现机制,对于常用数据结构的实现机制,应该说是必须要熟知的. 另外,并发容器我之前整理过,放在这篇文章里. Queue add和offer的区别在于达到上限时add抛出异常,offer返回false: remove和poll的区别在于,队列为空时前者抛出

线程池execute与queue add 区别

问题描述 private BlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(); private ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 50, 10, TimeUnit.SECONDS, queue); 请问大婶们,queue.add() 与 executor.execute() 区别,源码实在看的头晕@@ 问题补充:另 16个

java-JFrame中通过getcontentpane(),getLayeredPane()添加组件的区别。

问题描述 JFrame中通过getcontentpane(),getLayeredPane()添加组件的区别. 如题,JFrame可以通过getcontentpane(),得到一个JRootPane中的contian类对象contentPane. 也可以通过getLayeredPane(),得到JRootPane类对象layeredPane( JComponent子类). 通过两种方式得到的不同类型的不同对象都可以add()组件,并将组件显示出来,这两个对象都是继承自Component类. 那么

[数据结构] 队列

队列 队列是一种操作受限制的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作.进行插入操作的端称为队尾,进行删除操作的端称为队头.  队列中没有元素时,称为空队列.在队列这种数据结构中,最先插入的元素将是最先被删除的元素:反之最后插入的元素将是最后被删除的元素,因此队列又称为"先进先出"(FIFO-first in first out)的线性表. 队列空的条件:front=rear 队列满的条件: rear = MAXSIZE 顺序队列 建立顺

Java线程池和阻塞队列

Java提供了自己的线程池.每次只执行指定数量的线程,java.util.concurrent.ThreadPoolExecutor 就是这样的线程池. ThreadPoolExecutor 参数介绍: corePoolSize 核心线程数,指保留的线程池大小(不超过maximumPoolSize值时,线程池中最多有corePoolSize 个线程工作). maximumPoolSize 指的是线程池的最大大小(线程池中最大有corePoolSize 个线程可运行). keepAliveTime

Java 并发工具包 java.util.concurrent 用户指南

译序 本指南根据 Jakob Jenkov 最新博客翻译,请随时关注博客更新:http://tutorials.jenkov.com/java-util-concurrent/index.html. 本指南已做成中英文对照阅读版的 pdf 文档,有兴趣的朋友可以去 Java并发工具包java.util.concurrent用户指南中英文对照阅读版.pdf[带书签] 进行下载. 1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平

【JAVA秒会技术之多线程】Java 并发工具包 java.util.concurrent 用户指南

1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Java 的并发编程变得更加简单轻松的类.在这个包被添加以前,你需要自己去动手实现自己的相关工具类.本文我将带你一一认识 java.util.concurrent 包里的这些类,然后你可以尝试着如何在项目中使用它们.本文中我将使用 Java 6 版本,我不确定这和 Java 5 版本里的是否有一些差异.