線程五種狀態,即新建,就緒,運行,阻塞,死亡
說明
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()方法才能被喚醒
-
扫码下载安卓APP
-
微信扫一扫关注我们微信扫一扫打开小程序手Q扫一扫打开小程序
-
返回顶部