線程的生命週期及五種基本狀態

咱們知道線程是操做系統可以進行運算調度的最小單位,在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狀態

  • 調用無參的Object.wait()方法。等到notifyAll()或者notify()喚醒就會回到Runnable狀態。
  • 調用無參的Thread.join()方法。也就是好比你在主線程裏面創建了一個線程A,調用A.join(),那麼你的主線程是得等A執行完了纔會繼續執行,這是你的主線程就是等待狀態。
  • 調用LockSupport.park()方法。LockSupport是Java6引入的一個工具類Java併發包中的鎖都是基於它實現的,再調用LocakSupport.unpark(Thread thread),就會回到Runnable狀態。

第二種,Timed_Waiting(有時間限制的等待狀態):

其實這個狀態和Waiting就是有沒有超時時間的差異,這個狀態下也是不能分配CPU執行的。有五種狀況會使得Runnable狀態到waiting狀態

  • Object.wait(long timeout)。
  • Thread.join(long millis)。
  • Thread.sleep(long millis)。注意 Thread.sleep(long millis, int nanos) 內部調用的其實也是Thread.sleep(long millis)。
  • LockSupport.parkNanos(Object blocked,long deadline)。
  • LockSupport.parkUntil(long deadline)。

5.Terminated(終止狀態):在咱們的線程正常run結束以後或者run一半異常了就是終止狀態!

注意有個方法Thread.stop()是讓線程終止的,可是這個方法已經被廢棄了,不推薦使用,由於好比你這個線程獲得了鎖,你stop了以後這個鎖也隨着沒了,其它線程就都拿不到這個鎖了!這不玩完了麼!

因此推薦使用interrupt()方法。

interrupt()會使得線程Waiting和Timed_Waiting狀態的線程拋出 interruptedException異常,調用interrupt()方法後,使得Running狀態的線程再調用wait()、sleep()、jion()方法時拋出interruptedException異常,須要在catch中處理線程異常後的問題

 

若是Running狀態的線程沒有阻塞在I/O狀態的話,那隻能主動檢測本身是否是被中斷了,使用isInterrupted()。

相關文章
相關標籤/搜索