LinkedBlockingDeque

来源:互联网 发布:java 回文字符串 编辑:程序博客网 时间:2024/05/17 04:16

LinkedBlockingDeque

JDK上面介绍:

是一个基于已链接节点的、任选范围的阻塞双端队列。

可选的容量范围构造方法参数是一种防止过度膨胀的方式。如果未指定容量,那么容量将等于 Integer.MAX_VALUE。只要插入元素不会使双端队列超出容量,每次插入后都将动态地创建链接节点。

大多数操作都以固定时间运行(不计阻塞消耗的时间)。异常包括 remove、removeFirstOccurrence、removeLastOccurrence、contains、iterator.remove() 以及批量操作,它们均以线性时间运行。

此类及其迭代器实现 Collection 和 Iterator 接口的所有可选 方法。

它的继承关系为:

这里写图片描述

  • LinkedBlockingDeque就是一个双向并发的阻塞队列,其容量为final类型,入队列的时候可以挂机线程,并且可以头和尾进行操作。
  • 既然这是阻塞式列表:列表为空或者已满,操作不会被立即执行,而是将调用这个操作的线程阻塞到队列直到操作可以执行成功。
  • 由于有一个独占的锁,所以操作起来比较简单,所有队列操作加锁就能够实现,但是如果在高并发的情况下运行,性能就会有缺陷。

测试代码

package learnimport java.util.concurrent.{ExecutorService, Executors, LinkedBlockingDeque}import scala.actors.threadpool.TimeUnit/**  * Created by lws on 2017/9/12.  */class Test {}object Test{  var threadPool:ExecutorService  = Executors.newFixedThreadPool(5)  val link = new LinkedBlockingDeque[String](30)  def main(args: Array[String]): Unit = {    val num = 1 to 30    num.map(a =>threadPool.execute( new Runnable {      override def run(): Unit = {        link.push(a+"")        println(a +" has been pushe by "+Thread.currentThread().getName)        TimeUnit.SECONDS.sleep(1)      }    }))    num.map( b=>threadPool.execute(new Runnable {      override def run(): Unit = {        println(link.remove()+" has been take by "+Thread.currentThread().getName)      }    }))    TimeUnit.SECONDS.sleep(1)    threadPool.shutdown()  }}

在本例中我们开了一个有5个线程的线程池,每一个线程都先执行插入到链表数据的指令,然后当链表数据插入到了30个之后,在执行获取,链表中数据块的信息指令。获取的结果如下:

26 has been pushe by pool-1-thread-530 has been pushe by pool-1-thread-229 has been pushe by pool-1-thread-426 has been take by pool-1-thread-227 has been take by pool-1-thread-128 has been take by pool-1-thread-329 has been take by pool-1-thread-530 has been take by pool-1-thread-4

可以看出29被线程池1的第四个线程插入,但是被线程池中的第五个线程取出,好了到此我们完成测试完成。

原创粉丝点击