sleep和wait的區別

2021-10-04 10:46:33 字數 1904 閱讀 3953

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...