condition.await
生活随笔
收集整理的這篇文章主要介紹了
condition.await
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
調用Condition的await()方法(或者以await開頭的方法),會使當前線程進入等待隊列并釋放鎖,同時線程狀態變為等待狀態。當從await()方法返回時,當前線程一定獲取了Condition相關聯的鎖
public final void await() throws InterruptedException { if (Thread.interrupted()) //表示await允許被 中斷 throw new InterruptedException(); Node node = addConditionWaiter(); //創建一個 新的節點,節點狀態為condition,采用的數據結構仍然是鏈表 int savedState = fullyRelease(node); //釋放當前的鎖,得到鎖的狀態,并喚醒AQS隊列中的一個線程 int interruptMode = 0; //如果當前節點沒有在同步隊列上,即還沒有被signal,則將當前線程阻塞 while (!isOnSyncQueue(node)) {//判斷這個節點是否在AQS隊列上,第一次判斷的是false,因為前面已經釋放鎖了 LockSupport.park(this); //通過park掛起當前線程 if ((interruptMode = checkInterruptWhileWaiting(node)) != 0) break; } // 當這個線程醒來,會嘗試拿鎖, 當 acquireQueued 返回 false 就是拿到鎖了. // interruptMode != THROW_IE -> 表示這個線程沒有成功將 node 入隊,但 signal 執行了 enq 方法讓其入隊了. // 將這個變量設置成 REINTERRUPT. if (acquireQueued(node, savedState) && interruptMode != THROW_IE) interruptMode = REINTERRUPT; // 如果 node 的下一個等待者不是 null, 則進行清理,清理 Condition 隊列上的節點. // 如果是 null ,就沒有什么好清理的了. if (node.nextWaiter != null) // clean up if cancelled unlinkCancelledWaiters(); // 如果線程被中斷了,需要拋出異常.或者什么都不做 if (interruptMode != 0) reportInterruptAfterWait(interruptMode); }?
總結
以上是生活随笔為你收集整理的condition.await的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Condition源码分析
- 下一篇: addConditionWaiter