1.當線程繼承Thread或者實現(xiàn)了Runnable創(chuàng)建了線程對象后,當new線程對象過后線程就進入了初始的狀態(tài)。
2.當線程對象調用了start()方法的時候圾笨,線程啟動進入可運行的狀態(tài)。
3.線程進入可運行狀態(tài)后逊谋,如果邏輯完成那么線程將會終結擂达,如果沒有執(zhí)行完畢中間JVM分配時間片用完,將進入可運行狀態(tài)胶滋,一旦線程被JVM選中則立即執(zhí)行板鬓。
4.運行狀態(tài)的情況比較復雜
第一:線程如果執(zhí)行run() main()方法結束后,完成邏輯究恤,線程就進入Terminated
第二:當線程調用sleep()或者join()方法就會進入Blocked狀態(tài)俭令,但是要注意的是阻塞的線程是不釋放當前所占有的系統(tǒng)資源,當sleep()結束或者join()等待其他線程來到部宿,當前線程則進入Runnable狀態(tài)等待JVM分配資源抄腔。
第三:當線程進入Runnable狀態(tài),但是還沒有開始運行的時候理张,此時發(fā)現(xiàn)需要的資源處于同步狀態(tài)synchronized赫蛇,這個時候線程將會進入Time waiting,JVM會使用隊列對這些線程進行控制,既先進行Time waiting的線程會先得到JVM資源進行執(zhí)行進入Waiting
第四:如果處于Runnable的線程調用yield()讓出JVM資源雾叭,那么就會進入New狀態(tài)和其他New狀態(tài)線程進行競爭重新進入Runnable
第五:如果當前線程調用wait()方法悟耘,則當前線程進入Time waiting但是這個時候當前線程會釋放所占有的JVM資源,進入這個狀態(tài)過后是不能自動喚醒的织狐,必須調用notify()或者notifyAll()方法作煌,線程進入Waiting。
1.首先sleep()是Thread類的方法靜態(tài)方法赚瘦,需要通過Thread類調用,Thread.sleep()粟誓。而wait()和notify()是Object類中的實例方法,因為java所有類都繼承于object類起意,所有類中都可以使用鹰服。
2.wait(),和notify()必須用在synchronized代碼塊中調用,否則會拋出異常(因為wait()需要釋放對象鎖悲酷,如果不在synchronized代碼塊中不能保證擁有對象鎖)套菜。
3.當在synchronized代碼塊中使用sleep(),線程會被掛起设易,但不會釋放對象鎖逗柴,所以如果有其他線程等待執(zhí)行該synchronized代碼塊,一直會被阻塞顿肺,等待該線程被喚醒釋放對象鎖戏溺。
4.當在synchronized代碼塊中使用wait(),線程會被掛起屠尊,需要notify()喚醒旷祸,但該線程會釋放對象鎖,所以其他線程可以執(zhí)行該synchronized代碼塊讼昆。