執行緒流程以及wait notify notifyAll用法
執行緒是為了讓我們更好的利用cpu或者滿足需要時候採用的技術。現在來了解一下整個執行緒的流程。
這張圖很好的解釋了整個執行緒的生命週期。
來說一下執行緒的各個狀態:
initialization:一個執行緒在new之後就會向作業系統申請資源。然後完成初始化等操作。
waitting:我們用到訊號機制實現同步時,人為呼叫執行緒的wait()方法,會進入waitting態。或者呼叫該執行緒的join
方法,其他沒有start的執行緒會進入waiting態。
Timedwaitting:當執行緒呼叫sleep之後就會進入Timedwaitting狀態。這時候執行緒是佔用cpu的,比如某個執行緒呼叫
sleep(1000),這時候作業系統為了保證他一秒之後能準確執行,允許他佔用cpu。並且這個執行緒如果獲得了鎖,
呼叫sleep並不會釋放鎖。這樣執行緒沉睡了一秒之後還能繼續原來的地方準確執行。
blocking:當執行緒訪問有鎖的共享資源的時候,如果競爭失敗,這個執行緒就會阻塞自己,進入blocked狀態。
waiting態被喚醒的執行緒競爭資源失敗也會進入blocked態
runnable:當執行緒訪問不帶鎖的共享資源,或者獲得了帶鎖的資源。這時候就會start()並且執行。
Terminated:執行緒執行結束,回收申請的資源
總結wait,notify,notifyAll:
執行緒的wait方法和notify(nofifyAll)方法是配合使用的。一個執行緒競爭資源失敗後進入呼叫wait進入waitting態。或者
競爭資源失敗進入blocked態。然後我們呼叫notify方法喚醒其中的一個執行緒(喚醒的執行緒是作業系統通過對多執行緒的
排程來決定喚醒哪個執行緒)。或者呼叫notifyAll喚醒所有的執行緒。被喚醒的執行緒去競爭鎖。競爭到的執行,競爭不到的
進入blocked態。如果我們不可以的去寫wait和notify,只是用了synchronized上鎖之後,作業系統是幫我們呼叫這些
方法的。