wait 和 sleep區別
1、這兩個方法來自不同的類分別是,sleep來自Thread類,和wait來自Object類。
sleep是Thread的靜態類方法,誰調用的誰去睡覺,即使在a線程裏調用了b的sleep方法,實際上還是a去睡覺,要讓b線程睡覺要在b的代碼中調用sleep。
2、最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。
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不需要捕獲異常
notify()和notifyAll()有什麼區別
先解釋兩個概念:
等待池:假設一個線程A調用了某個對象的wait()方法,線程A就會釋放該對象的鎖後,進入到了該對象的等待池,等待池中的線程不會去競爭該對象的鎖。
鎖池:只有獲取了對象的鎖,線程才能執行對象的 synchronized 代碼,對象的鎖每次只有一個線程可以獲得,其他線程只能在鎖池中等待
區別:
notify() 方法隨機喚醒對象的等待池中的一個線程,進入鎖池;notifyAll() 喚醒對象的等待池中的所有線程,進入鎖池。
synchronized
同步鎖 鎖的對象應當是final類型,或 this 否則如果對象發生變化會報異常 IllegalMonitorStateException
linux查看java線程數: ps -eLf | grep java | wc -l