sleep是thread類的方法,wait是object類中定義的方法
sleep方法可以在任何地方使用 ,wait方法只能在synchronized方法或synchronized塊中使用
thread.sleep只會讓出cpu, 不會導致鎖行為的改變
即如果當前執行緒擁有鎖,那麼thread.sleep不會讓執行緒釋放鎖,而只會主動讓出cpu,cpu會可以去執行其他任務了,因此thread.sleep不會影響鎖的相關行為
object.wait不僅讓出cpu, 還會釋放已經占有的同步資源鎖,以便其他在等待該資源的執行緒得到該資源,進而去執行
public
static
void
main
(string[
] args)
catch
(interruptedexception e)}}
}).start()
;try
catch
(interruptedexception e)
newthread
(new
runnable()
catch
(interruptedexception e)}}
}).start()
;}
執行結果:
執行過程:
system.out.println(「thread a is waiting to get lockk」);
執行system.out.println(「thread a get lock」);
執行thread.sleep(20);
由於20ms大於10ms,因此執行緒b開始執行
執行 system.out.println(「thread b is waiting to get lockk」);
由於執行緒b要獲取同步鎖,此時我們的同步鎖已經被a獲取,因此執行緒b只能去等待,a繼續執行
執行system.out.println(「thread a do wait method」);
執行緒a執行wait的時候,執行緒b開始執行,由於wait會釋放鎖,執行緒b獲取到執行緒鎖,執行緒b開始執行
執行system.out.println(「thread b get lock」);
執行system.out.println(「thread b is sleeping 10ms」);
執行thread.sleep(20);
執行system.out.println(「thread b is done」);
執行system.out.println(「thread a is done」);
這裡需要注意的是wait會釋放鎖。我們修改**,檢視sleep是否會釋放鎖
public
static
void
main
(string[
] args)
catch
(interruptedexception e)}}
}).start()
;try
catch
(interruptedexception e)
newthread
(new
runnable()
catch
(interruptedexception e)}}
}).start()
;}
執行結果:
如執行結果顯示,等a執行緒執行完畢釋放鎖之後才執行的執行緒b,說明sleep方法不會釋放鎖
sleep和wait的區別
關鍵字 sleep wait 1 這兩個方法來自不同的類分別是thread和object 2 最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他執行緒可以使用同步控制塊或者方法。3 wait,notify和notifyall只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在...
sleep 和 wait的區別
1 這兩個方法來自不同的類分別是,sleep來自thread類,和wait來自object類。sleep是thread的靜態類方法,誰呼叫的誰去睡覺,即使在a執行緒裡呼叫了b的sleep方法,實際上還是a去睡覺,要讓b執行緒睡覺要在b的 中呼叫sleep。2 最主要是sleep方法沒有釋放鎖,而wa...
sleep和wait的區別
1 這兩個方法來自不同的類分別是,sleep來自thread類,和wait來自object類。sleep是thread的靜態類方法,誰呼叫的誰去睡覺,即使在a執行緒裡呼叫了b的sleep方法,實際上還是a去睡覺,要讓b執行緒睡覺要在b的 中呼叫sleep。2 最主要是sleep方法沒有釋放鎖,而wa...