一、
線程的狀態轉換是線程式控制制的基礎。線程狀態總的可分為五大狀態:分別是生、死、可運行、運行、等待/阻塞。用一個圖來描述如下:
1、新狀態:線程對象已經建立,還沒有在其上調用start()方法。 2、可運行狀態:當線程有資格運行,但發送器還沒有把它選定為運行線程時線程所處的狀態。當start()方法調用時,線程首先進入可運行狀態。線上程運行之後或者從阻塞、等待或睡眠狀態回來後,也返回到可運行狀態。 3、運行狀態:線程發送器從可運行池中選擇一個線程作為當前線程時線程所處的狀態。這也是線程進入運行狀態的唯一一種方式。 4、等待/阻塞/睡眠狀態:這是線程有資格運行時它所處的狀態。實際上這個三狀態組合為一種,其共同點是:線程仍舊是活的,但是當前沒有條件運行。換句話說,它是可啟動並執行,但是如果某件事件出現,他可能返回到可運行狀態。 5、死亡態:當線程的run()方法完成時就認為它死去。這個線程對象也許是活的,但是,它已經不是一個單獨執行的線程。線程一旦死亡,就不能複生。 如果在一個死去的線程上調用start()方法,會拋出java.lang.IllegalThreadStateException異常。
二、
線程在一定條件下,狀態會發生變化。線程變化的狀態轉換圖如下:
1、建立狀態(New):新建立了一個線程對象。 2、就緒狀態(Runnable):線程對象建立後,其他線程調用了該對象的start()方法。該狀態的線程位於可運行線程池中,變得可運行,等待擷取CPU的使用權。 3、運行狀態(Running):就緒狀態的線程擷取了CPU,執行程式代碼。 4、阻塞狀態(Blocked):阻塞狀態是線程因為某種原因放棄CPU使用權,暫時停止運行。直到線程進入就緒狀態,才有機會轉到運行狀態。阻塞的情況分三種: (一)、等待阻塞:啟動並執行線程執行wait()方法,JVM會把該線程放入等待池中。 (二)、同步阻塞:啟動並執行線程在擷取對象的同步鎖時,若該同步鎖被別的線程佔用,則JVM會把該線程放入鎖池中。 (三)、其他阻塞:啟動並執行線程執行sleep()或join()方法,或者發出了I/O請求時,JVM會把該線程置為阻塞狀態。當sleep()狀態逾時、join()等待線程終止或者逾時、或者I/O處理完畢時,線程重新轉入就緒狀態。 5、死亡狀態(Dead):線程執行完了或者因異常退出了run()方法,該線程結束生命週期。
相關引用:
http://lavasoft.blog.51cto.com/62575/27069