1. 程式人生 > >線程狀態&&Wait和sleep的區別?

線程狀態&&Wait和sleep的區別?

線程

線程堆棧內容解析:

技術分享圖片

Wait和sleep的區別?

共同點:都是把當前線程阻塞住,等待或休眠
不同點:
Wait( ) : 當線程執行到wait()方法上,當前線程會釋放監視鎖,此時其他線程可以占有該鎖,一旦wait()方法執行完成,當前線程繼續持有該鎖,直到執行完鎖的作用域;如下圖:
技術分享圖片
Sleep( ) : sleep() 和鎖操作無關,如果該方法恰好在一個鎖的保護範圍內,當前線程即使執行sleep的時候,仍然保持監視鎖。。如下圖:
技術分享圖片
當一個線程占有一個鎖的時候,線程堆棧會打印一個-locked<0x22bffb60>
當一個線程正在等在其他線程釋放該鎖,線程堆棧會打印一個-waiting to lock<0x22bffb60>

當一個線程占有一個鎖,但又執行在該鎖的wait上,線程堆棧中首先打印locked,然後打印-waiting on <0x22c03c60>

線程的狀態

RUNNABLE線程正在運行狀態。(Runnable狀態的線程不一定消耗CPU)
技術分享圖片
TIMED_WAITING(on object monitor)表示當前線程被掛起一段時間,說明該線程正在執行obj.wait(ing time)方法,該線程不消耗cpu。
技術分享圖片
TIMED_WAITING(sleeping) 表示當前線程被掛起一段時間,正在執行Thread.sleep(int time )方法,如:
技術分享圖片
WAITING(on object monitor)當前線程被掛起,正在執行無參數的obj.wait()方法,只能通過notify喚醒,因此不消耗cpu

技術分享圖片

線程狀態&&Wait和sleep的區別?