国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java 線程 wait() notify() 方法

2019-11-07 23:48:19
字體:
來源:轉載
供稿:網友
// 大家注意到沒有,在調用wait方法時,都是用while判斷條件的,而不是if, // 在wait方法說明中,也推薦使用while,因為在某些特定的情況下,線程有可能被假喚醒,// 使用while會循環檢測更穩妥。 //-------------!!!!!!!!!!!!!!wait和notify方法必須工作于synchronized內部,且這兩個方法只能由鎖對象來調用  /* notify public final void notify() 喚醒在此對象監視器上等待的單個線程。如果所有線程都在此對象上等待,則會選擇喚醒其中一個線程。選擇是任意性的,并在對實現做出決定時發生。 線程通過調用其中一個wait 方法,在對象的監視器上等待。 直到當前的線程放棄此對象上的鎖定,才能繼續執行被喚醒的線程。 被喚醒的線程將以常規方式與在該對象上主動同步的其他所有線程進行競爭;例如,喚醒的線程在作為鎖定此對象的下一個線程方面沒有可靠的特權或劣勢。 此方法只應由作為此對象監視器的所有者的線程來調用。通過以下三種方法之一,線程可以成為此對象監視器的所有者: 通過執行此對象的同步 (Sychronized) 實例方法。 通過執行在此對象上進行同步的 synchronized 語句的正文。 對于 Class 類型的對象,可以通過執行該類的同步靜態方法。 一次只能有一個線程擁有對象的監視器。 拋出: IllegalMonitorStateException - 如果當前的線程不是此對象監視器的所有者。 notifyAll public final void notifyAll() 喚醒在此對象監視器上等待的所有線程。線程通過調用其中一個 wait 方法,在對象的監視器上等待。 直到當前的線程放棄此對象上的鎖定,才能繼續執行被喚醒的線程。被喚醒的線程將以常規方式與在該對象上主動同步的其他所有線程進行競爭; 例如,喚醒的線程在作為鎖定此對象的下一個線程方面沒有可靠的特權或劣勢。 此方法只應由作為此對象監視器的所有者的線程來調用。請參閱 notify 方法,了解線程能夠成為監視器所有者的方法的描述。 拋出: IllegalMonitorStateException - 如果當前的線程不是此對象監視器的所有者。 wait public final void wait(long timeout)                 throws InterruptedException 導致當前的線程等待,直到其他線程調用此對象的 notify() 方法或notifyAll() 方法,或者超過指定的時間量。 當前的線程必須擁有此對象監視器。 此方法導致當前線程(稱之為 T)將其自身放置在對象的等待集中,然后放棄此對象上的所有同步要求。出于線程調度目的, 線程 T 被禁用,且處于休眠狀態,直到發生以下四種情況之一: 其他某個線程調用此對象的 notify 方法,并且線程 T 碰巧被任選為被喚醒的線程。 其他某個線程調用此對象的 notifyAll 方法。 其他某個線程中斷線程 T。 已經到達指定的實際時間。但是,如果 timeout 為零,則不考慮實際時間,該線程將一直等待,直到獲得通知。 然后,從對象的等待集中刪除線程 T,并重新進行線程調度。然后,該線程以常規方式與其他線程競爭,以獲得在該對象上同步的權利; 一旦獲得對該對象的控制權,該對象上的所有其同步聲明都將被還原到以前的狀態 - 這就是調用wait 方法時的情況。 然后,線程T 從wait 方法的調用中返回。所以,從wait 方法返回時,該對象和線程T 的同步狀態與調用wait 方法時的情況完全相同。 在沒有被通知、中斷或超時的情況下,線程還可以喚醒一個所謂的虛假喚醒 (spurious wakeup)。 雖然這種情況在實踐中很少發生,但是應用程序必須通過以下方式防止其發生,即對應該導致該線程被提醒的條件進行測試,如果不滿足該條件,則繼續等待。 換句話說,等待應總是發生在循環中,如下面的示例: synchronized (obj) { while (<condition does not hold>) obj.wait(timeout); ... // Perform action apPRopriate to condition      }  (有關這一主題的更多信息,請參閱 Doug Lea 撰寫的《Concurrent Programming in java (Second Edition)》 (Addison-Wesley, 2000) 中的第 3.2.3 節或 Joshua Bloch 撰寫的《Effective Java Programming Language Guide》(Addison-Wesley, 2001) 中的第 50 項。 如果當前線程在等待時被其他線程中斷,則會拋出InterruptedException。在按上述形式恢復此對象的鎖定狀態時才會拋出此異常。 注意,由于 wait 方法將當前的線程放入了對象的等待集中,所以它只能解除此對象的鎖定;可以同步當前線程的任何其他對象在線程等待時仍處于鎖定狀態。 此方法只應由作為此對象監視器的所有者的線程來調用。請參閱 notify 方法,了解線程能夠成為監視器所有者的方法的描述。 參數: timeout - 要等待的最長時間(以毫秒為單位)。 拋出: IllegalArgumentException - 如果超時值為負。 IllegalMonitorStateException - 如果當前的線程不是此對象監視器的所有者。 InterruptedException - 如果在當前線程等待通知之前或者正在等待通知時,另一個線程中斷了當前線程。在拋出此異常時,當前線程的中斷狀態 被清除。 wait public final void wait(long timeout,                        int nanos)                 throws InterruptedException 導致當前的線程等待,直到其他線程調用此對象的 notify() 方法或notifyAll() 方法,或者其他某個線程中斷當前線程,或者已超過某個實際時間量。 此方法類似于一個參數的 wait 方法,但它允許更好地控制在放棄之前等待通知的時間量。用毫微秒度量的實際時間量可以通過以下公式計算出來: 1000000*timeout+nanos 在其他所有方面,此方法執行的操作與帶有一個參數的 wait(long) 方法相同。需要特別指出的是,wait(0, 0) 與wait(0) 相同。 當前的線程必須擁有此對象監視器。該線程發布對此監視器的所有權,并等待下面兩個條件之一發生: 其他線程通過調用 notify 方法,或 notifyAll 方法通知在此對象的監視器上等待的線程醒來。 timeout 毫秒值與 nanos 毫微秒參數值之和指定的超時時間已用完。 然后,該線程等到重新獲得對監視器的所有權后才能繼續執行。 對于某一個參數的版本,實現中斷和虛假喚醒是有可能的,并且此方法應始終在循環中使用: synchronized (obj) { while (<condition does not hold>) obj.wait(timeout, nanos); ... // Perform action appropriate to condition      }  此方法只應由作為此對象監視器的所有者的線程來調用。請參閱 notify 方法,了解線程能夠成為監視器所有者的方法的描述。 參數: timeout - 要等待的最長時間(以毫秒為單位)。 nanos - 額外時間(以毫微秒為單位,范圍是 0-999999)。 拋出: IllegalArgumentException - 如果超時值是負數,或者毫微秒值不在 0-999999 范圍內。 IllegalMonitorStateException - 如果當前線程不是此對象監視器的所有者。 InterruptedException - 如果在當前線程等待通知之前或者正在等待通知時,其他線程中斷了當前線程。在拋出此異常時,當前線程的中斷狀態 被清除。 wait public final void wait()                 throws InterruptedException 導致當前的線程等待,直到其他線程調用此對象的 notify() 方法或notifyAll() 方法。換句話說,此方法的行為就好像它僅執行wait(0) 調用一樣。 當前的線程必須擁有此對象監視器。該線程發布對此監視器的所有權并等待,直到其他線程通過調用 notify 方法,或 notifyAll 方法通知在此對象的監視器上等待的線程醒來。然后該線程將等到重新獲得對監視器的所有權后才能繼續執行。 對于某一個參數的版本,實現中斷和虛假喚醒是可能的,而且此方法應始終在循環中使用: synchronized (obj) { while (<condition does not hold>) obj.wait(); ... // Perform action appropriate to condition      }  此方法只應由作為此對象監視器的所有者的線程來調用。請參閱 notify 方法,了解線程能夠成為監視器所有者的方法的描述。 拋出: IllegalMonitorStateException - 如果當前的線程不是此對象監視器的所有者。 InterruptedException - 如果在當前線程等待通知之前或者正在等待通知時,另一個線程中斷了當前線程。在拋出此異常時,當前線程的中斷狀態 被清除。 */
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泊头市| 蒲江县| 休宁县| 原平市| 夏津县| 铅山县| 常宁市| 天台县| 方山县| 陇南市| 桐城市| 金湖县| 上杭县| 怀化市| 仲巴县| 安西县| 墨竹工卡县| 安化县| 高唐县| 和田市| 宜州市| 克东县| 格尔木市| 彭山县| 花莲市| 红安县| 喀什市| 肥城市| 洛川县| 和田市| 得荣县| 崇信县| 柞水县| 惠东县| 平顶山市| 英山县| 安塞县| 任丘市| 河源市| 铜川市| 嘉兴市|