爲什麼java.lang.Object
有兩種通知方式 - notify
和notifyAll
?看起來notifyAll
至少都是notify
所做的一切,那爲什麼不直接用notifyAll
?如果使用notifyAll
而不是notify
,程序是否仍然正確,反之亦然?什麼影響這兩種方法之間的選擇?Java - 何時使用notify或notifyAll?
7
A
回答
1
根據的JavaDoc爲notify
:
喚醒在此對象監視器上等待的單個線程。如果任何線程正在等待這個對象,則選擇其中一個線程來喚醒。這種選擇是任意的,並且由實施決定。線程通過調用其中一個等待方法來等待對象的監視器。
如果您有一個應用程序使用(例如)一個隊列來放置項目,然後有許多工作線程將項目從隊列中取出,這可能很有用。當物品準備就緒後,您可以致電notify
喚醒單個工人處理物品。無可否認,這個例子有點做作 - 有可能有更好的方法在Java中實現 - 但你明白了。
1
兩個典型的例子。
假設您有生產者線程和消費者線程。由生產者生產的每個「包」應該由消費者消費。消費者將某些東西放入隊列中,然後調用notify()
(只有一個消費者應該被允許處理一個「數據包」。)
假設您想要在漫長的過程完成時收到通知。你想要一個嗶聲和屏幕更新。該過程執行notifyAll()
以通知蜂鳴聲和屏幕更新線程。
0
區別在於notify()
只會在當前線程上等待一個線程。對於大多數生產者/消費者和委託 - 等待應用程序,這是使用正確的方法。另外,如果只有一個其他線程正在等待當前線程,則不需要通知多於一個等待線程。
相比之下,notifyAll()
在所有線程上等待的所有。在每個(相關)睡眠線程必須執行某些操作的情況下,例如響應通知線程所包含的致命或高度重要的事件時,這更有用。
1
//contribute By E.Thulasiram and Team
class AA extends Thread{
AA a;
public void get(AA a){
this.a=a;
}
public void run(){
System.out.println("one");
synchronized (a) {
try{
a.wait();
System.out.println("one wake up");
this.wait();
}catch(Exception e){
System.out.println(e);
}
}
}
}
class BB extends Thread{
AA a;
public void get(AA a){
this.a=a;
}
public void run(){
System.out.println("two");
synchronized (a) {
try{
a.wait();
System.out.println("two wake up");
}catch(Exception e){
System.out.println(e);
}
}
}
}
class CC extends Thread{
AA a;
public void get(AA a){
this.a=a;
}
public void run(){
synchronized (a) {
a.notifyAll();
System.out.println("NotifyAll");
}
}
}
class DD{
public static void main(String args[]){
AA a=new AA();
BB b=new BB();
CC c=new CC();
a.get(a);
a.start();
b.get(a);
b.start();
c.get(a);
c.start();
}
}
相關問題
- 1. 通知單線程:notify,notifyAll或concurrent.locks.Condition?
- 2. 如何使Thread - notify()/ notifyAll()私有
- 3. 使用notify()和notifyAll()在代碼
- 4. 同步語句中的wait(),notify()和notifyAll()
- 5. Java wait()&notify()vs Android wait()&notify()
- 6. 如何在Java中使用wait()和notify()?
- 7. 如何在Java中使用wait()/ notify()
- 8. Java - wait and notifyAll
- 9. Java - wait()和notifyAll()
- 10. 如何使用wait/notifyAll
- 11. 爲什麼wait,notify和notifyAll方法在Object Class中?
- 12. Java程序在使用wait和notifyAll時會凍結
- 13. 如何使用gulp-notify-growl?
- 14. 的Java notifyAll的:拋出:IllegalMonitorStateException
- 15. Java線程通知()與notifyAll()
- 16. 爲什麼不調用wait(),notify()或notifyAll()而沒有同步塊而不是編譯器錯誤?
- 17. Java方法NotifyAll()不起作用?
- 18. new to multithreading-如何在java中使用wait()和notify()?
- 19. 不知道如何在Java中使用wait()和notify()
- 20. dojo模式 - 何時使用set/watch以及何時使用notify/observe?
- 21. Java線程wait()notify()方法
- 22. $ .notify不使用打字稿
- 23. 正確使用wait和notify
- 24. Java notify()在wait()之前被調用
- 25. 如何正確使用wait()和notify()
- 26. 如何使用wait \ notify處理器?
- 27. 轉換wait&notifyAll代碼以使用Java 1.5 Lock對象
- 28. 例如,如何調用notifyAll會影響Java中的執行?
- 29. 在java中等待,通知和notifyall?
- 30. Java的通知(),notifyAll的()和wait()方法
該問題的接受答案暗示了一個答案 - 差異在於性能,通過使用notifyAll來喚醒無法實際工作的線程僅僅是一個性能問題。所以我認爲這個問題的答案 - notifyAll總是正確的 - 只是沒有表現。 – mdma 2010-05-14 15:49:22
自Java 5(2004年)以來,新增了一個併發庫。 (這個庫實際上要舊得多)我建議你使用這些類,我會勸阻使用notify或notifyAll。 – 2010-05-14 22:19:44
這個問題的答案就在這裏StackOverflow:[Java通知()與notifyAll()](https://stackoverflow.com/questions/37026/java-notify-vs-notifyall-all-over-again) 。 – smountcastle 2010-05-14 13:12:25