java線程的wait
㈠ java多線程中await和wait的區別
調用await/wait的時候卻釋放了其獲取的鎖並阻塞等待。
await/wait,它會一直阻塞在條件隊列之上,之後某個線程調用對應的notify/signal方法,才會使得await/wait的線程回到就緒狀態,也是不一定立即執行。
await/wait方法必須放在同步塊裡面,否則會產生運行時異常。
wait方法是Object類的,await方法是Condition顯示條件隊列的。
㈡ java線程中,sleep時間過後會怎樣wait時間過後會怎樣
sleep時間過後,線程會進入就緒態,等待系統調度,如果此時系統資源請允許(CPU等各種需要的資源),線程就進入運行態繼續執行後續程序。
wait是等待其他線程喚醒,如果時間到後仍未被其他線程喚醒,則會拋出超時異常。當wait不帶參數時,程序會一直等下去直到被喚醒。
㈢ java中wait方法是什麼意思
wait方法用在 synchronized 方法或者 synchronized塊中。
一般在判斷語句中,如果某條件被觸發,讓當前線程wait並釋放對象的鎖。
此時可以讓其他線程可以對用以對象調用synchronized方法。
直到調用 notify或者notifyAll後 wait的線程才有可能執行。
所以一般wait 和 notify是成對出現的。
有點復雜,去看看線程同步有關的東西吧。
㈣ java里 對線程的wait方法只有在synchronized下才有用嗎
不是,可以不用synchronized,但Java推薦在調用wait方法前將對象鎖住
其實,從並發的角度考慮,wait是不能放在synchronized鎖里的,會引起死鎖。
試考慮,當wait和notify方法都在synchronized鎖里的時候,調用wait方法前將對象鎖住,然後調用wait方法,線程被掛起,需要其它線程調用notify將其喚醒。
由於notify方法也在synchronized裡面,其它線程調用notify的時候要獲得對象的鎖,但此時鎖已經被wait所在的線程持有,而且wait線程已經被掛起,所以notify因為無法獲得鎖而掛起,這樣二者相互等待,導致死鎖。
Java裡面可以將wait和notify放在synchronized裡面,是因為Java是這樣處理的:
在synchronized代碼被執行期間,線程調用對象的wait()方法,會釋放對象鎖標志,然後進入等待狀態,然後由其它線程調用notify()或者notifyAll()方法通知正在等待的線程。
㈤ JAVA多線程suspend,resume和wait,notify的區別
suspend,使線程進入停滯狀態,除非收到resume消息,否則該線程不會變回可執行狀態。
wait():使一個線程處於等待狀態,並且釋放所持有的對象的lock;
sleep():使一個正在運行的線程處於睡眠狀態,是一個靜態方法,調用此方
法要捕捉InterruptedException異常;
notify():喚醒一個處於等待狀態的線程,注意的是在調用此方法的時候,
並不能確切的喚醒某一個等待狀態的線程,而是由JVM確定喚醒哪個線程,而且
不是按優先順序;
notityAll():喚醒所有處入等待狀態的線程,注意並不是給所有喚醒線程一
個對象的鎖,而是讓它們競爭。
㈥ 誰能幫我解釋一下java線程中的wait()方法的作用與執行原理非常感謝!
wait()方法是java.lang.Object類韋線程提供的用於實現線程間通信的同步控制方法。wait()方法使當前線程主動釋放互斥鎖,並進入該互斥鎖的等待隊列。(也就是說,它使當前線程暫停執行,等待其他線程執行notify()方法或者notifyall()方法後再繼續執行本線程。)本方法用於釋放一個項目的線程,喚醒另一個可能在等待的線程。有兩種調用格式:
1.wait()等待通信線程喚醒後再繼續執行本線程。
2.wait(long millis)等待通信線程喚醒或者最多等待millis毫秒後,再繼續執行本線程。
我知道的就這么多了哈,希望對你能有一點幫助哦~~
㈦ java 線程中wait和notify的問題
這個程序挺經典的.
我不知道你對wait這是不是很熟,我按我的說,有問題再溝通:
首先看
main函數,兩句話,Procer對象和Consumer對象都引用了同一個p.
Procer類的run
前面有
synchronized(p)
說明該線程用到 synchronized 里的對象變數時,別的線程只能等待.
再看
if(p.bFull) {
try{p.wait();} catch (Exception e) {}
}
也就是說該線程用到了p對象,
而如果當運行到該線程時,
且p.bFull為真時
該線程進行等待,讓其他線程運行
到這的思路如果沒有問題,
那麼我們假設
假設
p.bFull為假,
那麼會再往下運行
也就是設置姓名,性別,
此時p.bFull仍然為假
之後設置 p.bFull 為真
p.notify()
當設置p.bFull為真時,表示下次如果仍然是該線程執行,將會wait.
而p.notify()是為了解以p為鎖的線程,因為當前線程正在運行,所以當前線程肯定不需要解鎖,那可能需要被解鎖的,也就是Consumer對象的線程.
當前線程從開始運行到目前的位置,Consumer線程是一直在wait的,因為Consumer線程在while下面直接就synchronized (p)也就是這兩個線程同時只能一個線程運行.
也就是說,要麼這次運行Procer,要麼運行Consumer
按我上面說的,Procer的運行邏輯應該已經清楚了,而Consumer的線程運行邏輯跟Procer一樣,我就不多說了,
問題的關鍵在於
當Procer運行一次,之後Consumer運行一次,是比較好理解,交叉運行唄.
但如果Procer運行完,又運行了Procer線程,而沒有讓Consumer運行的時候,程序會怎麼運行?(反之一樣)
我下面來解釋.
當Procer運行一次,又運行了Procer時,這時因為沒有Consumer線程的介入
,p的bFull應該為真,
這時運行到
Procer線程的
if (p.bFull) {
try {
p.wait();
} catch (Exception e) {
}
時,因為p.bFull為真了,
所以運行下面的代碼,
也就是讓當前線程等待,而用來等待的鎖就是p
這時,當前線程等待了,
也就要執行Consumer線程了,也就是相當於強制切換線程
運行一次Consumer線程後,Procer仍然在等待,如果這樣,那就會仍然運行Consumer線程,根據邏輯,Consumer會像Procer一樣,由於
if(!p.bFull) {
try{p.wait(); } catch (Exception e) {} }
而等待
這樣兩個線程都等待了
(如果你問,當!p.bFull如果成立,那p.bFull就不成立,那Procer不是該運行了嗎?但是,我剛剛的假設是當Procer已經等待時,那麼Procer就不會因為p.bFull的改變而繼續運行了)
按上面所說,如果按這樣的邏輯,最終會導致兩個線程同時等待沒有解鎖,
為了解決這個問題,
就在程序的每個線程的
p.bFull = false;
後面,加上了
p.notify();
讓以p為鎖的線程解鎖等待.
這樣,就可以使程序的兩個線程來回切換了.
㈧ Java線程中wait狀態和block狀態的區別
BLOCKED是指線程正在等待獲取鎖;WAITING是指線程正在等待其他線程發來的通知(notify),收到通知後,可能會順序向後執行(RUNNABLE),也可能會再次獲取鎖,進而被阻塞住(BLOCKED)
㈨ java線程wait方法
wait和notify是用在多線程競爭同一鎖資源的情況下使用的。
你這段代碼實際是個單線程,這個線程自己把自己阻塞了,自然不可能自己把自己喚醒。
你的意圖怎麼實現呢?需要加入另外一個線程,下面是我仿照你的意圖寫的一段代碼,供參考下
publicclassA
{
publicA(){
finalAa=this;
Threadth1=newThread(){
@Override
publicvoidrun(){
//一直循環,去嘗試著喚醒a
try
{
this.sleep(10000);
}catch(InterruptedExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}//為檢查是不是能真正實現喚醒a,等待10000毫秒,此時保證a已經處於等待狀態中。
while(true){
/**
*用notify喚醒的線程必須是持有當前鎖對象的線程
*/
synchronized(a){
a.notify();
}
}
}
};
th1.setDaemon(true);//這句也是必須的,將th1設為守護線程,保證在喚醒a以後,所有活動的線程都為守護線程,jvm能及時推出
th1.start();//和a.run的順序不可以換
this.run();
}
publicstaticvoidmain(String[]args)
{
newA();
}
publicvoidrun()
{
/**
*這里可以換成這樣,直接鎖住this就行了
*/
synchronized(this)
{
try
{
this.wait();//阻塞當前的線程
}catch(InterruptedExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}finally{
System.out.println("1");//執行finally
}
}
}
}
㈩ java中的sleep和wait的區別
sleep和wait的區別:
1、sleep的意思是:睡,睡覺,睡眠。
2、wait的意思是:等候,推遲,延緩等待,耽擱,伺候用餐。
拓展資料
sleep的用法
1、They were exhausted from lack of sleep
由於缺乏睡眠,他們非常疲憊。
2、During the car journey, the baby slept
坐車來的路上,寶寶睡著了。
3、I think he may be ready for a sleep soon.
我想他也許很快就要睡一覺了。
4、I can't get to sleep with all that singing.
那些歌聲攪得我無法入睡。
5、I didn't lose too much sleep over that investigation.
我並不太擔心那個調查。
wait
1、I walk to a street corner and wait for the school bus
我走到街角等校車。
2、There'll be a car waiting for you
會有輛汽車等你。
3、I want to talk to you, but it can wait
我想和你談談,但可以晚點再說。
4、If you think this all sounds very exciting, just wait until you read the book
如果你覺得所有這些聽起來令人興奮,那就等著去讀這本書吧。
5、'Wait a minute!' he broke in. 'This is not giving her a fair hearing!'
「等一下,」他插嘴說,「這沒有給她一個公平的解釋機會!」