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

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

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

瀏覽:152日期: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久久,三上悠亚国产精品一区二区三区
美女视频免费精品| 老牛国内精品亚洲成av人片| 亚洲激情五月| 欧美/亚洲一区| 一区久久精品| 免费人成在线不卡| 日韩精品乱码av一区二区| 四虎精品一区二区免费| 日韩精品高清不卡| 奇米777国产一区国产二区| 日本成人在线一区| 国产精品天堂蜜av在线播放| 国产精品密蕾丝视频下载| 欧美日韩黄网站| 精品五月天堂| 一区二区三区视频免费观看| 日韩视频不卡| 日韩精品一区二区三区中文 | 91欧美极品| 高清av不卡| 亚洲一区二区三区四区五区午夜| 日韩综合一区二区| 国产精品二区不卡| 亚欧成人精品| 久久久人人人| 日韩在线黄色| 成人三级高清视频在线看| 日韩专区一卡二卡| 国产高潮在线| 日韩精品第二页| 99久久婷婷这里只有精品| 日韩欧美中文字幕一区二区三区 | aa亚洲婷婷| 成人国产精品一区二区网站| 亚洲自拍另类| 日韩视频网站在线观看| 日本欧美一区二区在线观看| 成人亚洲一区二区| 日韩成人av影视| 日韩午夜免费| 欧美日韩免费看片| 精品欧美日韩精品| 国产精品毛片在线看| 国产a亚洲精品| 国产免费久久| 亚州精品视频| 丝袜亚洲另类欧美| 黄色国产精品| 国产尤物精品| 蜜臀91精品国产高清在线观看| 日韩在线高清| 91久久久精品国产| 国产精品99视频| 精品国产成人| 国产精品2023| 久久91视频| 精品久久福利| 91av亚洲| 久久久久99| 亚洲黑丝一区二区| 亚洲国产专区| 亚洲一区成人| 日韩精品一区二区三区免费视频| 日韩专区视频网站| 97精品国产99久久久久久免费| 91精品国产自产精品男人的天堂 | 免费人成精品欧美精品| 日韩一区欧美二区| 蜜臀久久久久久久| 日韩精品视频在线看| 国产麻豆一区二区三区精品视频| 国产另类在线| 日韩亚洲一区在线| 亚洲视频www| 日韩三级一区| 福利精品在线| 蘑菇福利视频一区播放| 青青国产精品| 国产不卡人人| 日韩一区二区三区免费播放| 黑丝一区二区三区| 91福利精品在线观看| 久久久久久夜| 日韩中文字幕一区二区三区| 国产精一区二区| 精品国产亚洲一区二区三区在线 | 久久人人97超碰国产公开结果| 欧美日韩在线网站| 亚洲狼人精品一区二区三区| 精品三级在线观看视频| 国产国产精品| 国产精品巨作av| 国产传媒在线观看| 日韩一区二区三区四区五区| 中文在线а√天堂| 视频国产精品| 性欧美videohd高精| 日本亚州欧洲精品不卡| 高清av不卡| 国产精品115| 蜜桃av一区二区| 日本欧美不卡| 国内在线观看一区二区三区 | 欧美日韩伊人| 香蕉视频亚洲一级| 日韩欧美中文字幕在线视频| 私拍精品福利视频在线一区| 日本99精品| 国产一级久久| 亚洲第一区色| 亚洲天堂资源| 麻豆久久久久久久| 国产欧美日韩一级| 激情五月综合网| 国产精品伊人| 天堂俺去俺来也www久久婷婷| 亚洲欧洲一区二区天堂久久| 日韩精品不卡一区二区| 麻豆精品在线视频| 国产精品蜜月aⅴ在线| 午夜在线视频观看日韩17c| 秋霞影院一区二区三区| 日本精品黄色| 岛国精品一区| 精品视频一二| 国产一区二区三区四区| 久久国产精品美女| 国产精品久久久久久妇女| 欧美日韩调教| 久久99久久人婷婷精品综合| 日韩国产欧美一区二区三区| 日韩激情一区二区| 国产精品亚洲综合色区韩国| 日本精品一区二区三区在线观看视频| 激情综合自拍| 日韩视频免费| 日韩制服丝袜先锋影音| 丝袜国产日韩另类美女| 日韩精品免费视频一区二区三区| 在线看片日韩| 国产高清亚洲| 欧美亚洲国产激情| 免费不卡在线视频| 国产精品男女| 高清av一区二区三区| 丝袜亚洲另类欧美| 国产精品nxnn| 99国产精品视频免费观看一公开| 亚洲ww精品| 欧美1区2区3区| 免费人成黄页网站在线一区二区| 青青在线精品| 亚洲国产影院| 国产精品一页| 亚洲深夜av| 国产一区二区亚洲| 色8久久久久| 超碰99在线| 日韩精品91亚洲二区在线观看| 国产一二在线播放| 日韩精品一区第一页| 国产精品毛片一区二区在线看| 欧美中文字幕| 国产高清不卡| 国产女人18毛片水真多18精品| 超级白嫩亚洲国产第一| 日韩欧美2区| 一本色道久久精品| 国产一区二区三区视频在线| 亚洲精品观看| 亚洲综合电影一区二区三区| 动漫av一区| 国产伦精品一区二区三区千人斩| 黄色av日韩| 日韩毛片视频| 日韩av有码| 久久精品一区二区国产| 色综合视频一区二区三区日韩 | 婷婷久久免费视频| 久久九九国产| 国产传媒在线| 国产精品亚洲欧美日韩一区在线| 丝袜美腿亚洲一区| 五月综合激情| 国产亚洲一区二区手机在线观看| 国产亚洲高清在线观看| 亚洲精品进入| 亚洲精品第一| 日韩一区二区三区四区五区| 蜜臀精品一区二区三区在线观看 | 久久99青青| 国产欧美88| 国产精品一区免费在线| 日本成人在线视频网站| 日韩美女国产精品| 婷婷亚洲成人| 国产精品一站二站| 成人在线观看免费视频| 国产资源在线观看入口av| 老牛影视精品|