方法wait()的作用是使當前執行**的執行緒進行等待。在呼叫wait()之前,執行緒必須獲得該物件的物件級別鎖,即只能在同步方法或同步塊中呼叫wait()方法。在執行wait()方法後,當前執行緒釋放鎖。
方法notify()也要在同步方法或同步塊中呼叫,即在呼叫前,執行緒也必須獲得該物件的物件級別鎖。該方法用來通知那些可能等待該物件的物件鎖的其他執行緒,如果有多個執行緒等待,則由執行緒規劃器隨機挑選出其中乙個呈wait狀態的執行緒,對其發出通知notify,並使它等待獲取該物件的物件鎖。需要說明的是,在執行notify()方法後,當前執行緒不會馬上釋放該物件鎖,呈wait狀態的執行緒也並不能馬上獲取該物件鎖,要等到執行notify()方法的執行緒將程式執行完,也就是退出synchronized**塊後,當前執行緒才會釋放鎖,而呈wait狀態所在的執行緒才可以獲取該物件鎖。
方法notifyall()可以使所有正在等待佇列中等待同一共享資源的「全部」執行緒從等待狀態退出,進入可執行狀態。此時,優先順序最高的那個執行緒最先執行,但也可能似乎隨機執行,這要取決於jvm虛擬機器的實現。
當執行緒呈wait()狀態時,呼叫執行緒物件的interrupt()方法會出現interruptedexception異常,鎖也會被釋放。
帶乙個引數的wait(long)方法的功能是等待某一時間內是否有執行緒對鎖進行喚醒,如果超過這個時間則自動喚醒。
在很多情況下,主線程建立並啟動子執行緒,如果子執行緒中要進行大量的耗時運算,主線程往往早於子執行緒結束之前結束。這時,如果主線程想等待子執行緒執行完成之後再結束,比如子執行緒處理乙個資料,主線程要取得這個資料中的值,就要用到join()方法。方法join()的作用是等待執行緒物件銷毀。
方法join具有使執行緒排隊執行的作用,有些類似同步的執行效果。join與synchronized的區別是:join在內部使用wait()方法進行等待,而synchronized關鍵字使用的是「物件監視器」原理做為同步。
在join過程中,如果當前執行緒物件被中斷,則當前執行緒出現異常。
join(long)中的引數是設定等待的時間。
方法join(long)的功能在內部是使用wait(long)方法來實現的,所以join(long)具有釋放鎖的特點。而sleep(long)方法不會釋放鎖。
執行緒間通訊
執行緒間通訊 多個執行緒在操作統一資源,但各個執行緒操作的動作不同。資源 class res class input implements runnable public void run else x x 1 2 class output implements runnable public vo...
執行緒間通訊
執行緒間的通訊 在乙個多執行緒的應用程式中,所有執行緒共享程序資源,協同工作。所以,執行緒之間的通訊是編寫多執行緒 應用的必不可少的環節。執行緒之間的通訊包括互斥 同步等,它是多 執行緒設計中最難控制的部分,也是關鍵部分。執行緒間的互斥 1 臨界區 在乙個多執行緒 的應用程式中,可能存在這樣的危險 ...
執行緒間通訊
執行緒間通訊 其實就是多個執行緒在操作同乙個資源 但是操作的動作不同。等待喚醒機制 wait notify 0 notifyall 都使用在同步中,因為要對持有監視器 鎖 的執行緒操作。所以要使用在同步中,因為只有同步才具有鎖 為什麼這些操作執行緒的方法要定義object類中呢?因為這些方法在操作同...