LinkedBlockingQueue

LinkedBlockingQueue是一个基于已链接节点的、范围任意的blocking queue的实现。
    此队列按 FIFO(先进先出)排序元素。队列的头部 是在队列中时间最长的元素。队列的尾部 是在队列中时间最短的元素。
    新元素插入到队列的尾部,并且队列检索操作会获得位于队列头部的元素。链接队列的吞吐量通常要高于基于数组的队列,
    但是在大多数并发应用程序中,其可预知的性能要低。
    可选的容量范围构造方法参数作为防止队列过度扩展的一种方法。
    如果未指定容量,则它等于 Integer.MAX_VALUE。除非插入节点会使队列超出容量,否则每次插入后会动态地创建链接节点。

1:如果未指定容量,默认容量为Integer.MAX_VALUE ,容量范围可以在构造方法参数中指定作为防止队列过度扩展。
    2:此对象是 线程阻塞-安全的

   3:不接受 null 元素

4:它实现了BlockingQueue接口。

5:实现了 Collection 和 Iterator 接口的所有可选 方法。

6:在JDK5/6中,LinkedBlockingQueue和ArrayBlocingQueue等对象的poll(long timeout, TimeUnit unit)存在内存泄露Leak的对象AbstractQueuedSynchronizer.Node,据称JDK5会在Update12里Fix,JDK6会在Update2里Fix

  下面介绍几种常用的方法:

定义一个输出方法:

  static void v(Object s){System.out.println(s.toString());}

  LinkedBlockingQueue<String>  bq=new LinkedBlockingQueue<String>();

    for(int i=0;i<100;i++)
    {
       bq.add("i"+i);//如果空间已满,此方法会抛出异常,所以这就是put,或者offer方法的优势所在
   }

String s1=bq.take();//i0
    String s2=bq.take();//i1

bq.offer("ix",5,TimeUnit.SECONDS);//在尾部插入一个元素,如果有必要    ,等待 指定的时间,使得队列变得可用。返回boolean值  表示是否插入成功。

bq.put("ixx");//将指定的元素添加到队列的尾部,如有必要,则等待空间变得可用,如果空间满了,则会一直等到空间可用时,进行插入。

   bq.poll();//poll() //poll(long timeout, TimeUnit unit)  检索并移除此队列的头,如果此队列为空,则返回 null。

   bq.clear() 从队列彻底移除所有元素。

bq.peek()检索,但是不移除此队列的头,如果此队列为空,则返回 null。

//区别一下几种方法:

1. offer(E e) offer(E e,long timeout,TimeUnit unit)

  和

  put(E e)

都是想队列中插入元素,如果使用offer,则当队列可用或者等待指定时间后队列可用时,才能将元素插入成功。

如果使用put(E e),则会一直等待队列可用时插入元素。因为此队列是线程阻塞的,所以会存在被其他线程锁住,不可使用的时期段

此队列的容量 要么为指定的固定容量,不指定,容量则为Integer.MAX_VALUE.

2.poll() poll(long timeout,TimeUnit unit)和peek();

  poll方法是 立刻或者等待指定时间后,获取并且移除队列的头。如果队列为空,则为null

  peek方法是  获取但不移除此队列的头,如果此队列为空,则为null

时间: 2024-11-19 10:03:24

LinkedBlockingQueue的相关文章

深入剖析java并发之阻塞队列LinkedBlockingQueue与ArrayBlockingQueue

关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解Java类加载器(ClassLoader) 深入理解Java并发之synchronized实现原理 Java并发编程-无锁CAS与Unsafe类及其并发包Atomic 深入理解Java内存模型(JMM)及volatile关键字 剖析基于并发AQS的重入锁(ReetrantLock)及其Condition实现原理 剖析基于并发AQS的共

我用LinkedBlockingQueue写的连接池

什么是连接池呢? 我们登陆上某个网站,去修改个人信息.点击下单.修改购买商品的数量......当我们做这些操作时候, 我们已经连接上数据库并修改.增加.删除数据库中的数据,完成操作后,关闭连接(避免占用资源). 如果很多人访问这个网站并进行操作,那要创建很多个连接,而且只操作一次就关闭,这会显著的影响系统的 性能.连接池  就为解决这个难题应运而生. 连接池: 在系统初始化的时候,将数据库连接作为对象存放在内存中.当用户要访问数据库时,取出一个连接, 完成操作后归还到池中,等待下个用户使用.连接

LinkedBlockingQueue(lbq)阻塞队列

最近开发中,经常使用这个类LinkedBlockingQueue,它是BlockingQueue这个子类. 并发库中的BlockingQueue是一个比较好玩的类,顾名思义,就是阻塞队列.该类主要提供了两个方法put(),offer()和take(),poll(),前者将一个对象放 到队列尾部,如果队列已经满了,就等待直到有空闲节点:后者从head取一个对象,如果没有对象,就等待直到有可取的对象. 反正都是开发中常用的.记哈

ArrayBlockingQueue和LinkedBlockingQueue分析

一.BlockingQueue接口       BlockingQueue接口定义了一种阻塞的FIFO queue,每一个BlockingQueue都有一个容量,让容量满时往BlockingQueue中添加数据时会造成阻塞,当容量为空时取元素操作会阻塞. 二.ArrayBlockingQueue      ArrayBlockingQueue是一个由数组支持的有界阻塞队列.在读写操作上都需要锁住整个容器,因此吞吐量与一般的实现是相似的,适合于实现“生产者消费者”模式. 三.LinkedBlock

基于LinkedBlockingQueue源码自我实现线程安全队列

LinkedBlockingQueue是一个阻塞的.线程安全的.由链表实现的双向队列,和ArrayBlockingQueue一样,是最普通也是最常用的阻塞队列.现基于LinkedBlockingQueue源码自我实现一个单向的.简化版的LinkedBlockingQueue. package com.lzq.newInterview; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Re

BlockQueue中ArrayBlockingQueue和LinkedBlockingQueue比较

LinkedBlockingQueue是BlockingQueue的一种使用Link List的实现,它对头和尾(取和添加操作)采用两把不同的锁,相对于ArrayBlockingQueue提高了吞吐量.它也是一种阻塞型的容器,适合于实现"消费者生产者"模式. ArrayBlockingQueue是对BlockingQueue的一个数组实现,它使用一把全局的锁并行对queue的读写操作,同时使用两个Condition阻塞容量为空时的取操作和容量满时的写操作. 正因为LinkedBlock

并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法(转)

在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出).Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列. 注:什么叫线程安全?这个首先要明确.线程安全就是说多线程访问同一代码,不会产生不确定的结果. 并行和并发区别 1.并行是指两者同时执行一件事,比如赛跑,两个人都在不停的

Java并发学习笔记(八)-LinkedBlockingQueue

LinkedBlockingQueue是由链表组成的阻塞队列,先来看demo public class LinkedBlockingQueueDemo { public static void main(String[] args) { ExecutorService es = Executors.newCachedThreadPool(); BlockingQueue<Bread> queue = new LinkedBlockingQueue<Bread>(10); for(i

java消费者生产者模式及JDK之阻塞队列LinkedBlockingQueue实现

生产者消费者问题 (英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例.该问题描述了两个共享固定大小缓冲区的线程--即所谓的"生产者"和"消费者"--在实际运行时会发生的问题.生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程.与此同时,消费者也在缓冲区消耗这些数据.该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空

ThreadLocal,LinkedBlockingQueue,线程池 获取数据库连接

<pre name="code" class="java">package com.ctl.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Random; import java.util.concurrent.LinkedBlockingQueue; import java.ut