標籤:style blog java color 使用 strong
1、來源不同:
sleep()方法來自於 Thread 類的一個靜態方法, 只有繼承了線程類的子類才能調用該方法,且誰調用的誰去睡覺,即使在 A 線程裡調用了 B 的sleep方法,實際上還是 A 去睡覺,要讓 B 線程睡覺要在 B 的代碼中調用sleep。
1 static void sleep(long millis); //在指定的毫秒數內對當前正在執行的線程進行休眠操作2 static void sleep(long millis, int nanos); //在指定的毫秒加納秒內對當前執行線程進行休眠操作
wait()方法來自於 Object 類,Object類所有Java類的祖先。所以任何一個類都可以調用wait()方法。
1 void wait(); //在其他線程調用此對象的notify()方法或notifyAll()方法前,導致當前線程等待2 void wait(long timeout); //在其他線程調用此對象的notify()方法或notifyAll()方法,或者超過指定的時間量前,導致該線程等待
3 void wait(long timeout, int nanos); //在其他線程對用此對象的notify()方法或notifyAll()方法,或者其他某個線程終端當前線程,或者已超出某個實際時間量前,當前線程等待
2、最主要是sleep()方法沒有釋放鎖,而 wait() 方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。就如同蹲坑,就算在馬桶上睡著了也不讓出這個坑,你睡醒了還可以繼續,這就是sleep();拉到一半被boss換出去,讓出資源,這就是wait(),決定你再次蹲上這個坑的是boss的喚醒。
所以通常可以描述為 sleep 不出讓系統資源;wait是進入線程等待池等待,出讓系統資源,其他線程可以佔用CPU。一般wait不會加時間限制,因為如果wait線程的運行資源不夠,再出來也沒用,要等待其他線程調用 notify/notifyAll 喚醒等待池中的所有線程,才會進入就緒隊列等待OS分配系統資源。 sleep(milliseconds)可以用時間指定使它自動喚醒過來,如果時間不到只能調用interrupt()強行打斷。
Thread.Sleep(0)的作用是“觸發作業系統立刻重新進行一次CPU競爭”。
3、使用範圍:wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在任何地方使用
synchronized(x){ x.notify(); //或者wait() }
4、sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常