java線程的五種狀態


五種狀態

開始狀態(new)
就緒狀態(runnable)
運行狀態(running)
阻塞狀態(blocked)
結束狀態(dead)

狀態變化

1、線程剛創建時,是new狀態
2、線程調用了start()方法后,進入runnable狀態,此時並未真正執行,需要和其他線程競爭cpu資源
3、當該線程競爭到了cpu資源,進入running狀態
4、線程因為某種原因放棄CPU使用權,暫時停止運行。直到線程進入就緒狀態之間處於blocked狀態
(1)等待阻塞:運行的線程執行wait()方法,該線程會釋放占用的所有資源,JVM會把該線程放入“等待池”中,
進入這個狀態后,是不能自動喚醒的,必須依靠其他線程調用notify()或notifyAll()方法才能被喚醒,
(2)同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用,則JVM會把該線程放入“鎖池”中。
(3)其他阻塞:運行的線程執行sleep()或join()方法,或者發出了I/O請求時,JVM會把該線程置為阻塞狀態。
當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉入就緒狀態。
5、當線程正常執行結束會進入dead狀態(一個未捕獲的異常也會使線程終止)

注:

yield()只是使當前線程重新回到runnable狀態
sleep()會讓出cpu,不會釋放鎖
join()會讓出cpu,釋放鎖
wait() 和 notify() 方法與suspend()和 resume()的區別在於wait會釋放鎖,suspend不會釋放鎖
wait() 和 notify()只能運行在Synchronized代碼塊中,因為wait()需要釋放鎖,如果不在同步代碼塊中,就無鎖可以釋放
當線程調用wait()方法后會進入等待隊列(進入這個狀態會釋放所占有的所有資源,與阻塞狀態不同),
進入這個狀態后,是不能自動喚醒的,必須依靠其他線程調用notify()或notifyAll()方法才能被喚醒


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM