javasleep
Ⅰ java 中 sleep 和 wait 的區別
首先:sleep是通過線程來調用的。它是Thread身上的方法。而wait是Object身上的方法。
所以調用的時候需要用object來調用。
其次:原理不同。當前線程在同步代碼塊中,調用sleep之後,當前線程並沒有釋放鎖。意味著
其他線程如果競爭這個鎖。就要等待。
而當前線程在同步代碼塊中調用obj.wait之後。當前線程已經釋放鎖了。意味著其他對象,如果競爭
這個鎖。不需要等待。
說這么多,不如上代碼。場景:兩個線程同時競爭一個資源。使用同步代碼塊。
①競爭同一個obj對象,使用sleep。
publicclassTestSleep{
publicstaticvoidmain(String[]args)throwsException{
finalObjectobj=newObject();
finalThreadt1=newThread(){
@Override
publicvoidrun(){
synchronized(obj){
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println("1");
}
}
};
finalThreadt2=newThread(){
@Override
publicvoidrun(){
synchronized(obj){
System.out.println("2");
}
}
};
t1.start();
Thread.sleep(100);//確保t1先執行。先搶到obj的控制權。
t2.start();
}
}
分析:創建一個obj。兩條線程。Thread.sleep(100);確保讓t1先執行到run方法。所以t1會
先搶到obj的資源,給它上鎖。需要睡000ms,並不釋放obj鎖。此時t2已經跑起來,走到run方法同步代碼塊。
發現obj已經被t1搶到了。所以t2隻能等t1釋放obj鎖。而t1什麼時候釋放obj鎖?t1的同步代碼
塊執行完釋放。什麼時候執行完?列印1的時候執行完。t1釋放鎖之後。t2得到鎖。因為這里只有兩條
線程競爭obj鎖。所以接下來就列印2。
最終結果是先列印1再列印2。
再看另個一例子:
②競爭同一個obj對象,使用wait。
publicclassTestWaint{
publicstaticvoidmain(String[]args)throwsException{
finalObjectobj=newObject();
finalThreadt1=newThread(){
@Override
publicvoidrun(){
synchronized(obj){
try{
obj.wait();
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println("1");
}
}
};
finalThreadt2=newThread(){
@Override
publicvoidrun(){
synchronized(obj){
System.out.println("2");
obj.notify();
}
}
};
t1.start();
Thread.sleep(100);//確保t1先執行。
t2.start();
}
}
分析:創建一個obj。兩條線程。Thread.sleep(100);確保讓t1先執行到run方法。所以t1會
先搶到obj的資源,給它上鎖。然而接下來t1中調用了obj.wait();這個代碼,表示t1放棄對obj
的擁有權。也就是釋放鎖。(釋放了之後它需要等待。而不是往下執行,等待什麼?等待別人喚醒。
因為wait和notify方法相對。必須要有一個線程調用obj.nofity();時,t1才有可能再次蘇醒。否則永遠等待。)
t1釋放鎖,進入等待。意味著t2不用等到t1的同步代碼塊結束,就可以獲取到obj的控制權。
所以t2就給obj上鎖了。所以t2先列印2。然後調用了obj.nofity();此時t2已經結束。
由於沒有其他線程和t1競爭。此時t1蘇醒,再次獲獲得obj的控制權。往下走,t1線程結束。
所以:先列印2再列印1
講了挺多。我也覺得啰嗦。但是應該通俗易懂吧。
Ⅱ java中線程里的sleep的用法與yield的用法~
我來簡單答一下吧,yield建議不要使用了,這里不做解釋。wait字面理解就是等待,多用於並發處理中對資源的管理,調用該方法後,當前線程會放棄已取得的資源(就是放棄已獲得資源的鎖)並放棄cpu佔用,只到被notify,另被notify後,被wait的線程會從wait()方法後面繼續執行。sleep方法是當前線程放棄cpu的執行機會知道sleep時間結束。
Ⅲ java sleep方法
調用方法:Thread.sleep(0);
括弧內輸入要睡眠的毫秒數(1秒等於1000毫秒),調用這個方法會拋出異常,需要拋出或處理,它在睡眠被打斷時發生。
Ⅳ java中的sleep是什麼意思
sleep(毫秒數)是Thread類的靜態方法。
使用時:Thread.sleep(毫秒數);
如Thread.sleep(1000);該線程睡眠1秒鍾,之間此線程什麼都不做。
等1秒鍾之後,繼續餘下代碼執行。
不過線程是沒有保證的。也許1秒鍾之後,該線程沒有轉為可運行狀態,也是可能的。
Ⅳ java 中sleep()方法或者wait()方法的使用
簡單說:sleep由線程自動喚醒,wait必須顯示用代碼喚醒。
sleep是Thread類的靜態方法。sleep的作用是讓線程休眠制定的時間,在時間到達時恢復,也就是說sleep將在接到時間到達事件事恢復線程執行,例如:
try{
System.out.println("I'm going to bed");
Thread.sleep(1000);
System.out.println("I wake up");
}
catch(IntrruptedException e) {
}
wait是Object的方法,也就是說可以對任意一個對象調用wait方法,調用wait方法將會將調用者的線程掛起,直到其他線程調用同一個對象的notify方法才會重新激活調用者,例如:
//Thread 1
try{
obj.wait();//suspend thread until obj.notify() is called
}
catch(InterrputedException e) {
}
Ⅵ java中thread.sleep是什麼意思
sleep()方法是Thread類裡面的,主要的意義就是讓當前線程停止執行,讓出cpu給其他的線程,但是不會釋放對象鎖資源以及監控的狀態,當指定的時間到了之後又會自動恢復運行狀態。
wait()方法是Object類裡面的,主要的意義就是讓線程放棄當前的對象的鎖,進入等待此對象的等待鎖定池,只有針對此對象調動notify方法後本線程才能夠進入對象鎖定池准備獲取對象鎖進入運行狀態。
Ⅶ java中的sleep()方法!
不管哪個sleep啟動,結果都是:100 ,1000
;因為方法m2沒在線程run()方法調用,不受sleep影響,所以當sleep時,給m2時間先運行,然後再是run()中的m1。
Ⅷ java中的sleep()方法
1.所有這些語句都必須在方法裡面寫,類裡面只能存在屬性和方法。不存在語句
2.thread.sleep()需要捕捉異常,加try/catch