我見過的關於notify()和notifyAll()區別的最簡潔的程式碼
阿新 • • 發佈:2019-02-09
執行的結果:
Thread-0-<DAVID3>will invoke WAIT()
Thread-1-<DAVID2>will invoke WAIT()
Thread-2-<DAVID1>will invoke WAIT()
Thread-3-<DAVID0>::INVOKED NOTIFYALL() AND FINISHED
Thread-0-<DAVID2>has been ACTIVED
Thread-0-<DAVID2>will invoke WAIT()
Thread-1-<DAVID1>has been ACTIVED
Thread-1-<DAVID1>will invoke WAIT()
Thread-2-<DAVID0>has been ACTIVED
Thread-2-<DAVID0>::INVOKED NOTIFYALL() AND FINISHED
Thread-0-<DAVID1>has been ACTIVED
Thread-0-<DAVID1>will invoke WAIT()
Thread-1-<DAVID0>has been ACTIVED
Thread-1-<DAVID0>::INVOKED NOTIFYALL() AND FINISHED
Thread-0-<DAVID0>has been ACTIVED
Thread-0-<DAVID0>::INVOKED NOTIFYALL() AND FINISHED
看到了吧,一旦呼叫notifyAll()方法,所有的等待執行緒都會從呼叫wait()方法的地方繼續執行起來。
這個執行結果可能每次都不一樣,有時候只有兩個執行緒執行完成而其餘兩個執行緒在等待其它執行緒呼叫notifyAll()方法,有時候只有三個執行緒執行完成,而另一個還在等待中。
由於本文是講解notify以及notifyAll方法,所以對上面的原因不多加以解釋。
然後是notify()方法的例子:
就是將wait類中的customizedNotifyAll()方法中的notifyAll()方法換成notify()方法
執行結果:
Thread-1-<DAVID3>will invoke WAIT()
Thread-0-<DAVID2>will invoke WAIT()
Thread-2-<DAVID1>will invoke WAIT()
Thread-3-<DAVID0>::INVOKED NOTIFYALL() AND FINISHED
Thread-1-<DAVID2>has been ACTIVED
Thread-1-<DAVID2>will invoke WAIT()
Did you see that?所有的等待執行緒中,只有一個執行緒執行完成了,而其它的執行緒還在傻傻地等待,poor guys!
每次執行的結果會不一樣,但是始終只有一個執行緒能夠執行完成。
Summary:
notify()方法只是讓一個執行緒從wait中恢復過來,至於具體是哪個,那就得看那些執行緒的運氣了(不設定優先順序的情況下),繼續執行後面的語句;
notifyAll()方法是讓所有的執行緒從wait中恢復過來,繼續執行後面的語句。