線程的狀態

李一凡 2024-05-06 10:48 11次浏览 0 条评论 taohigo.com

線程五種狀態,即新建,就緒,運行,阻塞,死亡

說明

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()方法才能被喚醒