咱們知道線程是操做系統可以進行運算調度的最小單位,在java中的線程其實就是對操做系統的中的線程進行了封裝。java
咱們今天就來講說Java線程的生命週期,也就線程的生老病死!併發
Java的線程生命週期有六種狀態:工具
New(初始化狀態)spa
Runnable(就緒狀態)操作系統
Running(運行狀態)線程
Blocked(阻塞狀態)對象
Terminated(終止狀態)blog
1.New(初始化狀態):當線程對象對建立後,即進入了新建狀態,如:Thread t = new MyThread();生命週期
2.Runnable(就緒狀態):當調用線程對象的start()方法,線程即進入就緒狀態。處於就緒狀態的線程,只是說明此線程已經作好了準備,隨時等待CPU調度執行,並非說執行了start()此線程當即就會執行;資源
3.Running(運行狀態):當就緒狀態中的線程得到了CUP執行資源,執行run()中的代碼,這樣的線程咱們稱爲運行狀態的線程。
4.Blocked(阻塞狀態):處於運行狀態中的線程因爲某種緣由,暫時放棄對CPU的使用權,中止執行,此時進入阻塞狀態,直到其進入到就緒狀態,纔有機會再次被CPU調用以進入到運行狀態。線程的阻塞狀態分爲兩種:
第一種,Waiting(無時間限制的等待狀態):
這個狀態下是不能分配CPU執行的。有三種狀況會使得Running狀態到waiting狀態
第二種,Timed_Waiting(有時間限制的等待狀態):
其實這個狀態和Waiting就是有沒有超時時間的差異,這個狀態下也是不能分配CPU執行的。有五種狀況會使得Runnable狀態到waiting狀態。
5.Terminated(終止狀態):在咱們的線程正常run結束以後或者run一半異常了就是終止狀態!
注意有個方法Thread.stop()是讓線程終止的,可是這個方法已經被廢棄了,不推薦使用,由於好比你這個線程獲得了鎖,你stop了以後這個鎖也隨着沒了,其它線程就都拿不到這個鎖了!這不玩完了麼!
因此推薦使用interrupt()方法。
interrupt()會使得線程Waiting和Timed_Waiting狀態的線程拋出 interruptedException異常,調用interrupt()方法後,使得Running狀態的線程再調用wait()、sleep()、jion()方法時拋出interruptedException異常,須要在catch中處理線程異常後的問題。
若是Running狀態的線程沒有阻塞在I/O狀態的話,那隻能主動檢測本身是否是被中斷了,使用isInterrupted()。