Java中的notyfy()和notifyAll()的本質(zhì)區(qū)別
wait()方法表示,放棄當前對資源的占有權(quán),等啊等啊,一直等到有人通知我,我才會運行后面的代碼。
notify()方法表示,當前的線程已經(jīng)放棄對資源的占有,
通知等待的線程來獲得對資源的占有權(quán),但是只有一個線程能夠從wait狀態(tài)中恢復(fù),
然后繼續(xù)運行wait()后面的語句;
notifyAll()方法表示,當前的線程已經(jīng)放棄對資源的占有,
通知所有的等待線程從wait()方法后的語句開始運行。
讀出什么區(qū)別沒有?
上例子,先是一個nofiyAll()的例子:
Java代碼
package com.thread.wait;
public class Wait {
private int counter = 0;
private String name = null;
public Wait(int counter,String name){
this.counter = counter;
this.name = name;
}
public synchronized void doSomthing(){
int tempCounter = --counter;
if(tempCounter <= 0){
customizedNotifyAll();
}
else
{
while(tempCounter > 0){
try {
System.out.println(Thread.currentThread().getName()+"-<"+name+tempCounter+">"+"will invoke WAIT()");
--tempCounter;
wait();
} catch (InterruptedException e) {
e.printStackTrace();
notifyAll();
}
System.out.println(Thread.currentThread().getName()+"-<"+name+tempCounter+">"+"has been ACTIVED");
}
customizedNotifyAll();
}
}
public void customizedNotifyAll(){
notifyAll();
System.out.println(Thread.currentThread().getName()+"-<"+name+counter+">"+"::"+"INVOKED NOTIFYALL() AND FINISHED");
}
}
Java代碼
package com.thread.wait;
public class TestThread implements Runnable {
private Wait wait;
public TestThread(Wait wait){
this.wait = wait;
}
public void run() {
wait.doSomthing();
}
public static void main(String [] args){
Wait wait = new Wait(4,"DAVID");
Thread t1 = new Thread(new TestThread(wait));
Thread t2 = new Thread(new TestThread(wait));
Thread t3 = new Thread(new TestThread(wait));
Thread t4 = new Thread(new TestThread(wait));
t1.start();
t2.start();
t3.start();
t4.start();
}
}
運行的結(jié)果:
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
看到了吧,一旦調(diào)用notifyAll()方法,所有的等待線程都會從調(diào)用wait()方法的地方繼續(xù)運行起來。
這個運行結(jié)果可能每次都不一樣,有時候只有兩個線程運行完成而其余兩個線程在等待其它線程調(diào)用notifyAll()方法,有時候只有三個線程運行完成,而另一個還在等待中。
由于本文是講解notify以及notifyAll方法,所以對上面的原因不多加以解釋。
然后是notify()方法的例子:
就是將wait類中的customizedNotifyAll()方法中的notifyAll()方法換成notify()方法
運行結(jié)果:
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!
每次運行的結(jié)果會不一樣,但是始終只有一個線程能夠運行完成。
Summary:
notify()方法只是讓一個線程從wait中恢復(fù)過來,至于具體是哪個,那就得看那些線程的運氣了(不設(shè)置優(yōu)先級的情況下),繼續(xù)執(zhí)行后面的語句;
notifyAll()方法是讓所有的線程從wait中恢復(fù)過來,繼續(xù)執(zhí)行后面的語句。
以上所述是小編給大家介紹的Java中的notyfy()和notifyAll()的本質(zhì)區(qū)別,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Java I/O深入學(xué)習(xí)之File和RandomAccessFile
這篇文章主要介紹了Java I/O深入學(xué)習(xí)之File和RandomAccessFile, I/O系統(tǒng)即輸入/輸出系統(tǒng),對于一門程序語言來說,創(chuàng)建一個好的輸入/輸出系統(tǒng)并非易事。在充分理解Java I/O系統(tǒng)以便正確地運用之前,我們需要學(xué)習(xí)相當數(shù)量的類。,需要的朋友可以參考下2019-06-06
SpringBoot this調(diào)用@Bean效果詳解
這篇文章主要介紹了在一個@Bean方法內(nèi),this調(diào)用同一個類的@Bean方法會有什么效果,我們可以通過bean的名稱、bean的類型或者bean的名稱+類型來獲取容器中的bean2023-02-02
Spring boot 跳轉(zhuǎn)到j(luò)sp頁面的實現(xiàn)方法
本篇文章主要介紹了Spring boot 跳轉(zhuǎn)到j(luò)sp頁面的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04
Java如何使用Set接口存儲沒有重復(fù)元素的數(shù)組
Set是一個繼承于Collection的接口,即Set也是集合中的一種。Set是沒有重復(fù)元素的集合,本篇我們就用它存儲一個沒有重復(fù)元素的數(shù)組2022-04-04
Kafka利用Java實現(xiàn)數(shù)據(jù)的生產(chǎn)和消費實例教程
這篇文章主要給大家介紹了關(guān)于Kafka利用Java實現(xiàn)數(shù)據(jù)的生產(chǎn)和消費的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01
詳解Java實現(xiàn)JSONArray轉(zhuǎn)Map的三種實現(xiàn)方式
本文主要介紹了Java實現(xiàn)JSONArray轉(zhuǎn)Map的三種實現(xiàn)方式,本文只是自己常用的三種,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03

