日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:148日期: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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美日本不卡高清| 天堂va在线高清一区| 亚洲网址在线观看| 99国产精品自拍| 视频一区二区国产| 午夜久久av| 欧美视频一区| 亚洲精品婷婷| 青青草精品视频| 里番精品3d一二三区| 国产一区二区三区精品在线观看| 成人在线视频区| 日本а中文在线天堂| 成人午夜在线| 女人天堂亚洲aⅴ在线观看| 国产精品色网| 日韩av网站在线观看| 国产精品福利在线观看播放| 久久久精品五月天| 少妇精品久久久| 欧美aa在线视频| 欧美成人综合| 亚洲最新av| 国产亚洲一卡2卡3卡4卡新区| 六月丁香综合在线视频| 久久精品主播| 国产欧美88| 亚洲激情中文在线| 久久99蜜桃| 中文精品视频| 日韩综合一区| 日韩欧美美女在线观看| 中文一区一区三区高中清不卡免费| 2023国产精品久久久精品双| 欧美在线看片| 精品视频高潮| 日韩国产91| 免费在线日韩av| 日韩在线观看| 天堂网在线观看国产精品| 蜜桃视频一区二区| 亚洲综合色婷婷在线观看| 精品黄色一级片| 日韩在线成人| 欧美日韩中出| 精品三级久久| 国产精品va| 丝袜国产日韩另类美女| 精品成av人一区二区三区| 亚洲精品乱码久久久久久蜜桃麻豆| 91视频一区| 久久高清国产| 性欧美xxxx免费岛国不卡电影| 一区二区精品| 伊人久久成人| 欧美成人午夜| 伊人久久亚洲影院| 日本蜜桃在线观看视频| 精品国产午夜| 国产aa精品| 风间由美中文字幕在线看视频国产欧美| 青青草国产成人99久久| 日本成人中文字幕| 天堂久久一区| 91嫩草精品| 国产精品啊v在线| 麻豆中文一区二区| 国产69精品久久| 麻豆极品一区二区三区| 麻豆精品av| 久久九九国产| 国产亚洲在线| 日韩精品1区2区3区| 91成人精品在线| 国产经典一区| 日本不卡免费高清视频在线| 久久精品主播| 日韩精品视频一区二区三区| 奇米色欧美一区二区三区| 欧美激情福利| 视频福利一区| 美女精品在线观看| 国产剧情一区二区在线观看| 国产精品欧美日韩一区| 成人午夜网址| 香蕉成人久久| 国产亚洲欧美日韩在线观看一区二区| 久久精品国产久精国产| 99久久激情| 六月婷婷一区| 免费在线欧美黄色| 99久久www免费| 欧美午夜三级| 日韩和的一区二在线| 亚洲精品美女91| 日韩国产一区二区| 日本一区中文字幕| 丝袜美腿诱惑一区二区三区| 伊人久久成人| 97在线精品| 欧美在线首页| 一区在线免费| 日韩精品第一区| 国产精品午夜一区二区三区| 国产一区清纯| 精品视频一区二区三区在线观看 | 国产精品自拍区| 蜜桃精品在线| 国产日韩高清一区二区三区在线| 国产一区国产二区国产三区| 中文字幕日韩高清在线| 亚洲一级高清| 国产一区二区视频在线看| 日韩区欧美区| 天使萌一区二区三区免费观看| 91欧美在线| 久久国产88| 欧美不卡高清一区二区三区| 日韩三级精品| 免费久久99精品国产| 欧美成a人免费观看久久| 国产精久久久| 欧美日本精品| 亚洲精品激情| 国产韩日影视精品| 亚洲成av在线| 成人在线网站| 日韩精品免费一区二区三区| sm捆绑调教国产免费网站在线观看 | 免播放器亚洲一区| 亚洲网站视频| 久久久久久久久久久妇女| 成年男女免费视频网站不卡| 国产精品调教| 久久麻豆视频| 在线看片国产福利你懂的| 日韩欧美看国产| 激情国产在线| 欧洲亚洲一区二区三区| 一区在线免费| 日韩精品免费一区二区夜夜嗨| 日本高清久久| 久久精品国产999大香线蕉| 成人三级高清视频在线看| 久久久久久美女精品| 国产精品色网| 日韩精品欧美成人高清一区二区| 国产日产一区| 国产精品毛片一区二区在线看| av资源亚洲| 国产手机视频一区二区| 奇米亚洲欧美| 久久久久久久久成人| 日韩大片在线播放| 免费久久99精品国产自在现线| 亚洲精品九九| 国产精品高颜值在线观看| 国精品一区二区| 国产一精品一av一免费爽爽| 欧美韩日一区| 亚洲三级在线| 中文字幕在线看片| 综合激情婷婷| 欧美天堂视频| 日韩国产在线不卡视频| 欧洲亚洲一区二区三区| 日韩成人精品一区二区三区| 麻豆91精品视频| 国产精品日韩欧美一区| www.九色在线| 麻豆国产欧美一区二区三区| 伊人久久亚洲美女图片| 97人人精品| 国产精品传媒麻豆hd| 免费一区二区视频| 精品丝袜在线| 日本一区二区高清不卡| 91亚洲无吗| 亚洲我射av| 久久香蕉国产| 国产99在线| 精品国产99| 国产精品一区二区三区av| 亚洲综合日本| 欧美不卡高清| 999精品色在线播放| 日韩一区欧美| 色乱码一区二区三区网站| 国产精品成人**免费视频 | 日本久久黄色| 麻豆精品国产91久久久久久| 亚洲尤物av| 亚洲精品一级| 日韩二区在线观看| 日本午夜免费一区二区| 国产日韩1区| 久久国产三级| 国产劲爆久久| 精品国产网站| 日本精品黄色|