在Java中sleep和wait這兩個(gè)方法都可以用來進(jìn)行線程控制撩鹿,但是它們?cè)谑褂蒙嫌惺裁磪^(qū)別呢谦炬?
本質(zhì)區(qū)別
首先,要記住這個(gè)差別节沦,“sleep是Thread類的方法键思,wait是Object類中定義的方法”。盡管這兩個(gè)方法都會(huì)影響線程的執(zhí)行行為散劫,但是本質(zhì)上是有區(qū)別的稚机。
鎖行為區(qū)別
sleep方法是線程類Thread的靜態(tài)方法幕帆,讓調(diào)用線程進(jìn)入睡眠狀態(tài)获搏,讓出執(zhí)行機(jī)會(huì)給其他線程,等到休眠時(shí)間結(jié)束后失乾,線程進(jìn)入就緒狀態(tài)和其他線程一起競(jìng)爭(zhēng)cpu的執(zhí)行時(shí)間常熙。因?yàn)閟leep是Thread的靜態(tài)方法,他不能改變對(duì)象的鎖碱茁,當(dāng)一個(gè)synchronized塊中調(diào)用了sleep() 方法裸卫,線程雖然進(jìn)入休眠,但是對(duì)象的鎖沒有被釋放纽竣,其他線程依然無法訪問這個(gè)對(duì)象墓贿。
wait是Object類的方法,當(dāng)一個(gè)線程執(zhí)行到wait方法時(shí)蜓氨,它就進(jìn)入到一個(gè)和該對(duì)象相關(guān)的等待池聋袋,同時(shí)釋放對(duì)象的鎖,使得其他線程能夠訪問穴吹,可以通過notify幽勒、notifyAll方法來喚醒等待的線程。
使用范圍區(qū)別
wait港令、notify和notifyAll只能在同步控制方法或者同步控制塊里面使用啥容,而sleep可以在任何地方使用锈颗,例如:
synchronized(object){
object.notify()
//object.wait()
}
異常捕獲區(qū)別
sleep必須捕獲異常,而wait咪惠、notify和notifyAll不需要捕獲異常击吱,例如:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}