摘要:即調用任意對象的方法導致該線程阻塞,該線程不可繼續執行,并且該對象上的鎖被釋放。將所有等待該對象的線程全部喚起。
方法簡介 1. wait()
synchronized (lockObjectA) { try { lockObjectA.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }
此時,代碼塊中會釋放對對象lockObjectA的鎖定,同時使lockObjectA進行等待,直到有線程調用了它的notify()或notifyAll()方法,才繼續將lockObjectA鎖定,并繼續執行下面程序。
即:調用任意對象的 wait() 方法導致該線程阻塞,該線程不可繼續執行,并且該對象上的鎖被釋放。
synchronized (lockObjectA) { lockObjectA.notify(); }
喚醒在等待該對象同步鎖的線程(只喚醒一個),在調用此方法的時候,并不能確切的喚醒某一個等待狀態的線程,而是由JVM確定喚醒哪個線程,而且不是按優先級。
即:調用任意對象的notify()方法則導致因調用該對象的 wait()方法而阻塞的線程中隨機選擇的一個解除阻塞(但要等到獲得鎖后才真正可執行)。
將所有等待該對象的線程全部喚起。
示例package Test0315; /** * Created by Cesar on 2016/3/15. */ public class TestWait extends Thread { private static Object lockObjectA = new Object(); private int key; public TestWait(int key) { this.key = key; } @Override public void run() { if (key == 0) { synchronized (lockObjectA) { System.out.println(key + "開始等待"); try { lockObjectA.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(key + "等待結束"); System.out.println(key + "成功鎖定A"); try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(key + "釋放A"); } else if (key == 1) { synchronized (lockObjectA) { lockObjectA.notify(); } System.out.println(key + "釋放了A"); } else { synchronized (lockObjectA){ System.out.println(3+"鎖定了A"); } } } public static void main(String[] args) { TestWait wait = new TestWait(0); wait.setName("Test Wait"); wait.start(); System.out.println("主線程休眠開始"); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("主線程休眠結束,喚醒開始"); TestWait wait1 = new TestWait(1); wait1.start(); TestWait wait2 = new TestWait(2); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } wait2.start(); try { wait2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("全部結束"); } }結果
主線程休眠開始 0開始等待 主線程休眠結束,喚醒開始 1釋放了A 0等待結束 0成功鎖定A 0釋放A 3鎖定了A 全部結束
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65633.html
摘要:等待一段時間是否有線程喚醒鎖,如果沒有,超時自動喚醒。隨機喚醒等待隊列中的等待同一個鎖的一個線程,使這個線程退出等待隊列,進入可運行狀態。條件隊列中是處于等待狀態的線程,等待特定條件為真。在一般情況下,總應該調用喚醒所有需要被喚醒的線程。 方法 java.lang.Object public final native void wait() throws InterruptedExce...
摘要:用法中規定,在調用者三個方法時,當前線程必須獲得對象鎖。作用方法作用線程自動釋放占有的對象鎖,并等待。當生產者生產了一個數據或者消費者消費了一個數據之后,使用方法來通知所有等待當前對象鎖的線程,但是一次只會有一個等待的線程能拿到鎖。 基礎知識 首先我們需要知道,這幾個都是Object對象的方法。換言之,Java中所有的對象都有這些方法。 public final native void...
摘要:已經在上面有提到過,和的作用是喚醒正在的線程,是隨機喚醒線程中的一個,則是喚醒全部。釋放和不釋放鎖在多線程的操作中,鎖的釋放與否是必須要清楚的,是會釋放鎖,而則不會。 wait wait方法是Object中的方法,這個方法的功能特性:1).執行wait方法的前提是當前線程已經獲取到對象的鎖,也就是wait方法必須在synchronized修飾的代碼塊或者方法中使用。2).執行wait之...
摘要:不釋放持有的鎖,釋放鎖。在調用方法前,必須持有鎖,調用喚醒,也要持有鎖。休眠一定時間后,進入就緒狀態。這兩個都能被方法中斷當前狀態。用法方獲取鎖判斷條件,不滿足繼續滿足執行其他業務方獲取鎖改變條件通知為什么是而不是會一直循環,直到條件滿足。 sleep和wait sleep是Thread類的方法,wait是Object的方法。 sleep可以到處使用,wait必須是在同步方法或者代碼...
摘要:在這個等待通知機制中,我們需要考慮以下四個要素。何時等待線程要求的條件不滿足就等待。是會隨機地通知等待隊列中的一個線程,而會通知等待隊列中的所有線程。 由上一篇文章你應該已經知道,在 破壞占用且等待條件 的時候,如果轉出賬本和轉入賬本不滿足同時在文件架上這個條件,就用死循環的方式來循環等待,核心代碼如下: // 一次性申請轉出賬戶和轉入賬戶,直到成功 while(!actr.apply...
閱讀 3280·2023-04-26 02:09
閱讀 2573·2021-11-24 09:39
閱讀 3266·2021-11-16 11:52
閱讀 3614·2021-10-26 09:50
閱讀 2771·2021-10-08 10:05
閱讀 2456·2021-09-22 15:25
閱讀 3299·2019-08-30 13:14
閱讀 908·2019-08-29 17:06