电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

java并發中DelayQueue延遲隊列原理剖析

瀏覽:91日期:2022-08-11 09:14:50
介紹

DelayQueue隊列是一個延遲隊列,DelayQueue中存放的元素必須實現Delayed接口的元素,實現接口后相當于是每個元素都有個過期時間,當隊列進行take獲取元素時,先要判斷元素有沒有過期,只有過期的元素才能出隊操作,沒有過期的隊列需要等待剩余過期時間才能進行出隊操作。

源碼分析

DelayQueue隊列內部使用了PriorityQueue優先隊列來進行存放數據,它采用的是二叉堆進行的優先隊列,使用ReentrantLock鎖來控制線程同步,由于內部元素是采用的PriorityQueue來進行存放數據,所以Delayed接口實現了Comparable接口,用于比較來控制優先級,如下代碼所示:

public interface Delayed extends Comparable<Delayed> { /** * Returns the remaining delay associated with this object, in the * given time unit. * * @param unit the time unit * @return the remaining delay; zero or negative values indicate * that the delay has already elapsed */ long getDelay(TimeUnit unit);}

DelayQueue的成員變量如下所示:

// 鎖。 private final transient ReentrantLock lock = new ReentrantLock(); // 優先隊列。 private final PriorityQueue<E> q = new PriorityQueue<E>(); /** * Leader-Follower的變種。 * Thread designated to wait for the element at the head of * the queue. This variant of the Leader-Follower pattern * (http://www.cs.wustl.edu/~schmidt/POSA/POSA2/) serves to * minimize unnecessary timed waiting. When a thread becomes * the leader, it waits only for the next delay to elapse, but * other threads await indefinitely. The leader thread must * signal some other thread before returning from take() or * poll(...), unless some other thread becomes leader in the * interim. Whenever the head of the queue is replaced with * an element with an earlier expiration time, the leader * field is invalidated by being reset to null, and some * waiting thread, but not necessarily the current leader, is * signalled. So waiting threads must be prepared to acquire * and lose leadership while waiting. */private Thread leader = null;/** * Condition signalled when a newer element becomes available * at the head of the queue or a new thread may need to * become leader. */// 條件,代表如果有數據則通知Follower線程,喚醒線程處理隊列內容。private final Condition available = lock.newCondition();

Leader-Follower模式的變種,用于最小化不必要的定時等待,當一個線程被選擇為Leader時,它會等待延遲過去執行代碼邏輯,而其他線程則需要無限期等待,在從take或poll返回之前,每當隊列的頭部被替換為具有更早到期時間的元素時,leader字段將通過重置為空而無效,Leader線程必須向其中一個Follower線程發出信號,被喚醒的 follwer 線程被設置為新的Leader 線程。

offer操作

public boolean offer(E e) { // 獲取到鎖 final ReentrantLock lock = this.lock; lock.lock(); try { // 將元素存儲到PriorityQueue優先隊列中 q.offer(e); // 如果第一個元素是當前元素,說明之前隊列中為空,則先將Leader設置為空,通知等待線程可以爭搶Leader了。 if (q.peek() == e) { leader = null; available.signal();}// 返回成功return true; } finally {lock.unlock(); }}

offer操作前先進行獲取鎖的操作,也就是同一時間內只能有一個線程可以入隊操作。

獲取到ReentrantLock鎖對象。 將元素添加到PriorityQueue優先隊列中 如果隊列中最早過期的元素是自己,則說明隊列原先是空的,所以將Leader進行重置,通知Follower線程可以成為Leader線程。 最后進行解鎖操作。put操作

put操作其實就是調用的offer操作來進行添加數據的,以下是源碼信息:

public void put(E e) { offer(e);}take操作

public E take() throws InterruptedException { final ReentrantLock lock = this.lock; // 獲取可中斷的鎖。 lock.lockInterruptibly(); try { // 循環獲取數據。 for (;;) { // 獲取最早過期的元素,但是不彈出對象。 E first = q.peek(); // 如果最早過期的元素為空,說明隊列為空,則線程直接進入無限期等待,并且讓出鎖。 if (first == null)// 當前線程無限期等待,直到被喚醒,并且讓出鎖對象。available.await(); else {// 獲取最早過期的元素剩余過期時間。long delay = first.getDelay(NANOSECONDS);// 如果剩余過期時間小于0,則說明已經過期,反之還沒有過期。if (delay <= ) // 如果已經過期直接獲取最早過期的元素,并返回。 return q.poll();// 如果剩余過期日期大于0,則會進入到這里。// 將剛才獲取的最早過期的元素設置為空。first = null; // don’t retain ref while waiting// 如果有線程爭搶的Leader線程,則進行無限期等待。if (leader != null) // 無限期等待并讓出鎖。 available.await();else { // 獲取當前線程。 Thread thisThread = Thread.currentThread(); // 設置當前線程變為Leader線程。 leader = thisThread; try {// 等待剩余等待時間。available.awaitNanos(delay); } finally {// 將Leader設置為null。if (leader == thisThread) leader = null; }} }} } finally {// 如果隊列不為空,并且沒有Leader則通知等待線程可以成為Leader。if (leader == null && q.peek() != null) // 通知等待線程。 available.signal();lock.unlock(); }} 當獲取元素時,先獲取到鎖對象。 獲取最早過期的元素,但是并不從隊列中彈出元素。 最早過期元素是否為空,如果為空則直接讓當前線程無限期等待狀態,并且讓出當前鎖對象。 如果最早過期的元素不為空 獲取最早過期元素的剩余過期時間,如果已經過期則直接返回當前元素如果沒有過期,也就是說剩余時間還存在,則先獲取Leader對象,如果Leader已經有線程在處理,則當前線程進行無限期等待,如果Leader為空,則首先將Leader設置為當前線程,并且讓當前線程等待剩余時間。最后將Leader線程設置為空 如果Leader已經為空,并且隊列有內容則喚醒一個等待的隊列。poll操作

獲取最早過期的元素,如果隊列頭沒有過期的元素則直接返回null,反之返回過期的元素。

public E poll() { final ReentrantLock lock = this.lock; lock.lock(); try { E first = q.peek(); // 如果隊列為空或者隊列最早過期的元素沒有過期,則返回null。 if (first == null || first.getDelay(NANOSECONDS) > 0) return null; else // 出隊列操作。 return q.poll(); } finally {lock.unlock(); }}小結 DelayQueue是一個無界的并發延遲阻塞隊列,隊列中的元素必須實現Delayed接口,相應了需要實現Comparable接口實現比較的方法 Leader-Follower模式的變種,用于最小化不必要的定時等待,當一個線程被選擇為Leader時,它會等待延遲過去執行代碼邏輯,而其他線程則需要無限期等待,在從take或poll返回之前,每當隊列的頭部被替換為具有更早到期時間的元素時,leader字段將通過重置為空而無效,Leader線程必須向其中一個Follower線程發出信號,被喚醒的 follwer 線程被設置為新的Leader 線程。

到此這篇關于java并發中DelayQueue延遲隊列原理剖析的文章就介紹到這了,更多相關java DelayQueue延遲隊列內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
主站蜘蛛池模板: 环比机械 | 工业电炉,台车式电炉_厂家-淄博申华工业电炉有限公司 | 滁州高低温冲击试验箱厂家_安徽高低温试验箱价格|安徽希尔伯特 | 高压包-点火器-高压发生器-点火变压器-江苏天网 | 快速门厂家批发_PVC快速卷帘门_高速门_高速卷帘门-广州万盛门业 快干水泥|桥梁伸缩缝止水胶|伸缩缝装置生产厂家-广东广航交通科技有限公司 | 伶俐嫂培训学校_月嫂培训班在哪里报名学费是多少_月嫂免费政府培训中心推荐 | 塑料异型材_PVC异型材_封边条生产厂家_PC灯罩_防撞扶手_医院扶手价格_东莞市怡美塑胶制品有限公司 | 学校用栓剂模,玻璃瓶轧盖钳,小型安瓿熔封机,实验室安瓿熔封机-长沙中亚制药设备有限公司 | 华中线缆有限公司-电缆厂|电缆厂家|电线电缆厂家 | FAG轴承,苏州FAG轴承,德国FAG轴承-恩梯必传动设备(苏州)有限公司 | 风化石头制砂机_方解石制砂机_瓷砖石子制砂机_华盛铭厂家 | 防渗土工膜|污水处理防渗膜|垃圾填埋场防渗膜-泰安佳路通工程材料有限公司 | 网站建设-网站制作-网站设计-网站开发定制公司-网站SEO优化推广-咏熠软件 | 3d可视化建模_三维展示_产品3d互动数字营销_三维动画制作_3D虚拟商城 【商迪3D】三维展示服务商 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 | 塑木弯曲试验机_铜带拉伸强度试验机_拉压力测试台-倾技百科 | 众品地板网-地板品牌招商_地板装修设计_地板门户的首选网络媒体。 | 讲师宝经纪-专业培训机构师资供应商_培训机构找讲师、培训师、讲师经纪就上讲师宝经纪 | 2025福建平潭岛旅游攻略|蓝眼泪,景点,住宿攻略-趣平潭网 | 耐高温电缆厂家-远洋高温电缆 | 隧道窑炉,隧道窑炉厂家-山东艾瑶国际贸易 | 切铝机-数控切割机-型材切割机-铝型材切割机-【昆山邓氏精密机械有限公司】 | 臻知网大型互动问答社区-你的问题将在这里得到解答!-无锡据风网络科技有限公司 | 搅拌磨|搅拌球磨机|循环磨|循环球磨机-无锡市少宏粉体科技有限公司 | PVC地板|PVC塑胶地板|PVC地板厂家|地板胶|防静电地板-无锡腾方装饰材料有限公司-咨询热线:4008-798-128 | 安徽合肥格力空调专卖店_格力中央空调_格力空调总经销公司代理-皖格制冷设备 | 心肺复苏模拟人|医学模型|急救护理模型|医学教学模型上海康人医学仪器设备有限公司 | 玻璃钢型材_拉挤模具_玻璃钢拉挤设备——滑县康百思 | 安徽成考网-安徽成人高考网| 高速龙门架厂家_监控杆_多功能灯杆_信号灯杆_锂电池太阳能路灯-鑫世源照明 | 西安标准厂房_陕西工业厂房_西咸新区独栋厂房_长信科技产业园官方网站 | 818手游网_提供当下热门APP手游_最新手机游戏下载 | 电缆接头_防水接头_电缆防水接头_防水电缆接头_上海闵彬 | 铝箔-铝板-花纹铝板-铝型材-铝棒管-上海百亚金属材料有限公司 | 混合反应量热仪-高温高压量热仪-微机差热分析仪DTA|凯璞百科 | 密度电子天平-内校-外校电子天平-沈阳龙腾电子有限公司 | 行业分析:提及郑州火车站附近真有 特殊按摩 ?2025实地踩坑指南 新手如何避坑不踩雷 | 气体检测仪-氢气检测仪-可燃气体传感器-恶臭电子鼻-深国安电子 | 天津市能谱科技有限公司-专业的红外光谱仪_红外测油仪_紫外测油仪_红外制样附件_傅里叶红外光谱技术生产服务厂商 | 骨密度检测仪_骨密度分析仪_骨密度仪_动脉硬化检测仪专业生产厂家【品源医疗】 | 西安展台设计搭建_西安活动策划公司_西安会议会场布置_西安展厅设计西安旭阳展览展示 | 广州小程序开发_APP开发公司_分销商城系统定制_小跑科技 |