區別
1.
sleep
()方法屬於thread類,而wait
()屬於當前物件;
2.sleep
()可以在任何地方使用,而wait
()只能在同步方法或同步**塊中使用;
3.sleep
()會在指定的時間後重新恢復就緒狀態,而wait
()如果沒有設定超時時間,需要當前物件的其他執行緒呼叫notify
()方法或者notifyall
()重新喚醒執行緒進入就緒狀態;
4.只有在同步方法或者同步**塊中呼叫了sleep()
,當前執行緒才會一直占用著物件鎖,而不會釋放資源,其他執行緒則無法進入該同步方法或同步**塊中。而如果當前執行緒呼叫了wait
()方法,會釋放已獲取的物件鎖資源,並進入等待佇列,其他執行緒就可以獲取物件上的鎖資源。
相同點1.都可以通過thread.interrupt來中斷當前執行緒
下面是乙個關於sleep()和wait()鎖釋放的示例:
示例如下
public
class
testd
catch
(exception e)
newthread
(new
thread2()
).start()
;}private
static
class
thread1
implements
runnable
catch
(exception e)
system.out.
println
("thread1 is going on ....");
system.out.
println
("thread1 is over!!!");
}}}// private static class thread2 implements runnable catch (exception e)
// system.out.println("thread2 is going on....");
// system.out.println("thread2 is over!!!");
// }
// }
// }
//把上面的方法注釋去掉,把下面的類新增注釋,重新執行,對比一下有什麼不同
private
static
class
thread2
implements
runnable
//***************===
//區別
//如果我們把**:testd.class.notify();給注釋掉,即testd.class呼叫了wait()方法,但是沒有呼叫notify()
//方法,則執行緒永遠處於掛起狀態。
trycatch
(exception e)
system.out.
println
("thread2 is going on....");
system.out.
println
("thread2 is over!!!");
}}}
針對上面的示例做一下簡要說明:上面兩個thread2類的區別在於,最下面thread2類的synchronized僅僅是包裹了notify方法,而上面thread2類的synchronized包裹了整個run()方法。 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...