線程有幾種狀態(tài),分別是哪些?
1.New,新建狀態(tài),當程序new了一個線程后,線程就處于新建狀態(tài),此時線程還未啟動;當線程對象調(diào)用start()方法時,線程啟動進入Runnable(就緒狀態(tài))狀態(tài)
2.Runnable狀態(tài):可運行(就緒)狀態(tài);此時線程準備就緒,等待獲取CPU;
3.Running(運行狀態(tài));線程獲取到了cpu,進入運行狀態(tài),執(zhí)行run方法.
4.Blocking(阻塞狀態(tài)) 線程調(diào)用了slepp()方法,會主動放棄cpu資源;當阻塞結(jié)束時,該線程將會到就緒狀態(tài),而非直接進入運行狀態(tài).
5.Dead狀態(tài),也就是死亡狀態(tài);線程的run方法結(jié)束,就會進入dead狀態(tài),線程死亡后不能作為線程再次調(diào)用;
sleep讓當前線程進入休眠狀態(tài)(但線程不會釋放已獲取的鎖),從休眠狀態(tài)“蘇醒”后,線程會進入到Runnable狀態(tài)。
wait()//交出cpu,讓CPU去執(zhí)行其他的任務(wù),讓線程進入阻塞狀態(tài),同時也會釋放鎖
yield()//使當前線程交出CPU,讓CPU去執(zhí)行其他的任務(wù),但不會是線程進入阻塞狀態(tài),而是重置為就緒狀態(tài),yield方法不會釋放鎖
wait和sleep的區(qū)別:
1.sleep是thread類的靜態(tài)方法,而wait是object的
2.最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使其他線程可以使用同步控制塊或者方法
3.sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常。