作家
登录

Java阻塞队列实现原理分析

作者: 来源: 2017-04-12 13:05:16 阅读 我要评论

add办法和offer办法不会壅塞线程,put办法如不雅队列满了会壅塞线程,直到有线程花费了队列里的数据才有可能被唤醒。

这3个办法内部都邑应用可重入锁包管原子性。

数据的删除

ArrayBlockingQueue有不合的几个数据删除办法,poll、take、remove办法。

poll办法:

  1. public E poll() { 
  2.  
  3.     final ReentrantLock lock = this.lock; 
  4.  
  5.     lock.lock(); // 加锁,包管调用poll办法的时刻只有1个线程 
  6.  
  7.     try { 
  8.  
  9.         return (count == 0) ? null : extract(); // 如不雅队列琅绫腔元素了,返回null,不然调用extract办法 
  10.  
  11.     } finally { 
  12.  
  13.         lock.unlock(); // 释放锁,让其他线程可声调用poll办法 
  14.  
  15.     } 
  16.  
  17.  

poll办法内部调用extract办法:

  1. private E extract() { 
  2.  
  3.     final Object[] items = this.items; 
  4.  
  5.     E x = this.<E>cast(items[takeIndex]); // 获得取索引地位上的元素 
  6.  
  7.     items[takeIndex] = null; // 对应取索引上的数据清空 
  8.  
  9.     takeIndex = inc(takeIndex); // 取数据索引+1,当索引满了变成0 
  10.  
  11.     --count; // 元素个数-1 
  12.  
  13.     notFull.signal(); // 应用前提对象notFull通知,比如应用put办法放数据的时刻队列已满,被壅塞。这个时刻花费了一条数据,队列没满了,就须要调用signal进行通知 
  14.  
  15.     return x; // 返回元素 
  16.  
  17.  

常用的壅塞队列具体类有ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue、LinkedBlockingDeque等。

take办法:

  1. public E take() throws InterruptedException { 
  2.  
  3.     final ReentrantLock lock = this.lock; 
  4.  
  5.     lock.lockInterruptibly(); // 加锁,包管调用take办法的时刻只有1个线程 
  6.  
  7.     try { 
  8.  
  9.         while (count == 0) // 如不雅队列空,壅塞当前哨程,并参加到前提对象notEmpty的等待队列里 
  10.  
  11.             notEmpty.await(); // 线程壅塞并被挂起,同时释放锁 
  12.  
  13.         return extract(); // 调用extract办法 
  14.  
  15.     } finally { 
  16.  
  17.         lock.unlock(); // 释放锁,让其他线程可声调用take办法 

      推荐阅读

      大数据在预测性维修中的应用

    核心提示: 大年夜量来自于发念头和其他一些关键部件的监控数据,使得猜测性维修具备了可行性。越来越多的数据的收集和分析对象正在被开辟或者投入应用。大年夜量来自于发念头和其他一些关>>>详细阅读


    本文标题:Java阻塞队列实现原理分析

    地址:http://www.17bianji.com/lsqh/34749.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)