『壹』 java中sleep和join和yield和wait和notify的區別
1、sleep()
使當前線程(即調用該方法的線程)暫停執行一段時間,讓其他線程有機會繼續執行,但它並不釋放對象鎖。也就是說如果有synchronized同步快禪敗,其他線程仍然不能訪問共享數據。注意該方法要捕捉異常。
例如有兩個線程同時執行(沒有synchronized)一個線程優先順序為MAX_PRIORITY,另一個為MIN_PRIORITY,如果沒有Sleep()方法,只有高優先順序的線程執行完畢後,低優先順序的線程才能夠執行;但是高優先順序的線程sleep(500)後,低優先順序就有機會執行了。
總之,sleep()可以使低優先順序的線程得到執行的機會,當然也可以讓同優先順序、高優先順序的線程有執行的機會。
2、join()
join()方法使調用該方法的線程在此之前執行完畢,也就是等待該方法的線程執行完畢後再往下繼續執行。注意該方法也需要捕捉異常。
3、yield()
該方法與sleep()類似,只是不能由用戶指定暫停多長時間,並且yield()方法只能讓同優先順序的賀知顫線猛察程有執行的機會。
4、wait()和notify()、notifyAll()
這三個方法用於協調多個線程對共享數據的存取,所以必須在synchronized語句塊內使用。synchronized關鍵字用於保護共享數據,阻止其他線程對共享數據的存取,但是這樣程序的流程就很不靈活了,如何才能在當前線程還沒退出synchronized數據塊時讓其他線程也有機會訪問共享數據呢?此時就用這三個方法來靈活控制。
wait()方法使當前線程暫停執行並釋放對象鎖標示,讓其他線程可以進入synchronized數據塊,當前線程被放入對象等待池中。當調用notify()方法後,將從對象的等待池中移走一個任意的線程並放到鎖標志等待池中,只有鎖標志等待池中線程能夠獲取鎖標志;如果鎖標志等待池中沒有線程,則notify()不起作用。
notifyAll()則從對象等待池中移走所有等待那個對象的線程並放到鎖標志等待池中。
注意 這三個方法都是java.lang.Object的方法。
『貳』 JAVA中的Wait()和notify()方法使用時應注意些什麼
Wait()和notify():如果條件不滿足,則等待。當條件滿足時,等待該條件的線程將被喚醒。
一般用在synchronized機制中
例如:
線程A
synchronized(obj) {
while(!condition) {
obj.wait();
}
obj.doSomething();
}
當線程A獲得了obj鎖後,發現條件condition不滿足,無法繼續下一處理,於是線程A就wait()。
在另一線程B中,如果B更改了某些條件,使得線程A的condition條件滿足了,就可以喚醒線程A:
線程B
synchronized(obj) {
condition = true;
obj.notify();
}
需要注意的概念是:
◆調用obj的wait(), notify()方法前,必須獲得obj鎖,也就是必須寫在synchronized(obj) {……} 代碼段內。
◆調用obj.wait()後,線程A就釋放了obj的鎖,否則線程B無法獲得obj鎖,也就無法在synchronized(obj) {……} 代碼段內喚醒A.
◆當obj.wait()方法返回後,線程A需要再次獲得obj鎖,才能繼續執行。
◆如果A1,A2,A3都在obj.wait(),則B調用obj.notify()只能喚醒A1,A2,A3中的一個(具體哪一個由JVM決定)。
◆obj.notifyAll()則能全部喚醒A1,A2,A3,但是要繼續執行obj.wait()的下一條語句,必須獲得obj鎖,因此,A1,A2,A3隻有一個有機會獲得鎖繼續執行,例如A1,其餘的需要等待A1釋放obj鎖之後才能繼續執行。
◆當B調用obj.notify/notifyAll的時候,B正持有obj鎖,因此,A1,A2,A3雖被喚醒,但是仍無法獲得obj鎖。直到B退出synchronized塊,釋放obj鎖後,A1,A2,A3中的一個才有機會獲得鎖繼續執行。
『叄』 Java中notifyAll()方法的實際作用
notify(),notifyAll()都是要喚醒正在等待的線程,前者明確喚醒一個,後者喚醒全部。
當程序不明確知道下一個要喚醒的線程時,需要採用notifyAll()喚醒所有在wait池中的線程,讓它們競爭而獲取資源的執行權,但使用notifyAll()時,會出現死鎖的風險,因此,如果程序中明確知道下一個要喚醒的線程時,盡可能使用notify()而非notifyAll()。
有問題歡迎提問,滿意請採納,謝謝!
『肆』 java中notify怎麼使用
通常,多線程之間需要協調工作。例如,瀏覽器的一個顯示圖片的線程displayThread想要執行顯示圖片的任務,必須等待下載線程
downloadThread將該圖片下載完畢。如果圖片還沒有下載完,displayThread可以暫停,當downloadThread完成了任務
後,再通知displayThread「圖片准備完畢,可以顯示了」,這時,displayThread繼續執行。
以上邏輯簡單的說就是:如果條件不滿足,則等待。當條件滿足時,等待該條件的線程將被喚醒。在Java中,這個機制的實現依賴於wait/notify。等待機制與鎖機制是密切關聯的。例如:
synchronized(obj) {while(!condition) {obj.wait();}obj.doSomething();}
當線程A獲得了obj鎖後,發現條件condition不滿足,無法繼續下一處理,於是線程A就wait()。
在另一線程B中,如果B更改了某些條件,使得線程A的condition條件滿足了,就可以喚醒線程A:
synchronized(obj) {condition = true;obj.notify();}
i在Second線程里是一個局部變數,不是你開啟的兩個線程fir和sec的公共資源,所以通過i無法使
多線程的協調機制,所以你的線程喚醒不了。
『伍』 java同步中,為什麼要wait,又notify誰
在多線路程中經常用到。
當在一個線程A中執行 wait()後,這個線程就專會處於等待狀態。
如果想屬重新激活線程A,繼續向下執行代碼,就必須在另一個線程中來激活線程A
class A extends Thread
{
public void run()
{
wait();
System.out.println("end");
}
public synrhonized void abc()
{
notify();
}
}
class B extends Therad
{
public void run()
{
synchronized(A){A.notify()}; //激活
或
A.abc(); //激活
}
}
上面的代碼只是一個形式。
『陸』 幫忙解釋一下java中類的notify的含義,多謝了
1、notify()方法的含義:
(1)notify()方法是隨機喚醒一個線程,將等待隊列中的一個等待線程從等待隊列中移到同步隊列中。
(2)在執行完notify()方法後,當前線程不會馬上釋放該對象鎖,呈wait狀態的線程也不能馬上獲得該對象鎖。
要等到執行notify方法的線程將程序執行完 ,也就是退出sychronized代碼塊後,當前線程才會釋放鎖。而在同步隊列中的該線程才可以獲取該對象鎖。
2、對象所釋放的三個場景:
(1)執行完同步代碼塊就會釋放對象鎖;
(2)在執行代碼塊的過程中,遇到異常而導致線程終止,也會釋放對象鎖;
(3)在執行同步代碼塊的過程中,執行了鎖所屬對象的wait()方法,這個線程會釋放對象鎖,而此線程對象會進入線程等待池中,等待被喚醒。
(6)javajnotify擴展閱讀
Java中notify和notifyAll的區別:
Java提供了兩個方法notify和notifyAll來喚醒在某些條件下等待的線程,你可以使用它們中的任何一個,但是Java中的notify和notifyAll之間存在細微差別,這使得它成為Java中流行的多線程面試問題之一。
當你調用notify時,只有一個等待線程會被喚醒而且它不能保證哪個線程會被喚醒,這取決於線程調度器。
雖然如果你調用notifyAll方法,那麼等待該鎖的所有線程都會被喚醒,但是在執行剩餘的代碼之前,所有被喚醒的線程都將爭奪鎖定,這就是為什麼在循環上調用wait。
因為如果多個線程被喚醒,那麼線程是將獲得鎖定將首先執行,它可能會重置等待條件,這將迫使後續線程等待。
因此,notify和notifyAll之間的關鍵區別在於notify()只會喚醒一個線程,而notifyAll方法將喚醒所有線程。