1. 程式人生 > >5. 線程的狀態,和線程的阻塞方式

5. 線程的狀態,和線程的阻塞方式

自動 兩個 如何 new 等待 指定 als 參考 放棄

一、線程的狀態有6種

  1. 初始(NEW):新創建了一個線程對象,但還沒有調用start()方法。

  2. 運行(RUNNABLE):Java線程中將就緒(ready)和運行中(running)兩種狀態籠統的稱為“運行”。

    線程對象創建後,其他線程(比如main線程)調用了該對象的start()方法。該狀態的線程位於可運行線程池中,等待被線程調度選中,獲取CPU的使用權,此時處於就緒狀態(ready)。就緒狀態的線程在獲得CPU時間片後變為運行中狀態(running)。

  3. 阻塞(BLOCKED):表示線程阻塞於鎖。

  4. 等待(WAITING):進入該狀態的線程需要等待其他線程做出一些特定動作(通知或中斷)。

  5. 超時等待(TIMED_WAITING):該狀態不同於WAITING,它可以在指定的時間後自行返回。

  6. 終止(TERMINATED):表示該線程已經執行完畢。

  詳解:

  1.初始狀態(也稱創建線程):

  • 線程的實現有三種方式,一是繼承Thread類,二是實現Runnable接口,三是實現Callable接口,但是不管如何,當我們new了這個對象之後,線程就進入了初始化狀態。

  2.就緒狀態:

  • 就緒狀態只是說你資格運行,調度程序沒有挑選到你,你就永遠是就緒狀態。
  • 調用線程的start()方法,此線程進入就緒狀態。
  • 當前線程sleep()方法結束,其他線程join()結束,等待用戶輸入完畢,某個線程拿到對象鎖,這些線程也將進入就緒狀態。
  • 當前線程時間片用完了,調用當前線程的yield()方法,當前線程進入就緒狀態。
  • 鎖池裏的線程拿到對象鎖後,進入就緒狀態。

  3.運行狀態:

  • 線程調度程序從可運行池中選擇一個線程作為當前線程時線程所處的狀態。

  4.阻塞狀態:

  • 阻塞狀態是線程因為某種原因放棄CPU使用權,暫時停止運行。知道線程進入就緒狀態,才有機會轉到運行狀態。
  • 阻塞的情況分三種
    1. 等待阻塞:運行的線程執行wait()方法,該線程會釋放占用的所有資源,JVM會把該線程放入“等待池”中。進入這個狀態後,是不能自動喚醒的,必須依靠其他線程調用notify()或notifyAll()方法才能被喚醒
    2. 同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用,則JVM會把該線程放入“鎖池”中。
    3. 其他阻塞:運行的線程執行sleep()方法或join()方法,或者發出了I/O請求時,JVM會把該線程置為阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉入就緒狀態。

  5.等待狀態:

  • 處於這種狀態的線程不會被分配CPU執行時間,它們要等待被顯式地喚醒,否則會處於無限期等待的狀態。

  6.超時等待狀態:

  • 處於這種狀態的線程不會被分配CPU執行時間,不過無須無限期等待被其他線程顯示地喚醒,在達到一定時間後它們會自動喚醒。

  7.終止狀態(也稱死亡狀態):

  • 有兩個原因會導致線程死亡:
  1. run方法正常退出而自然死亡,
  2. 一個未捕獲的異常終止了run方法而使線程猝死。
  • 為了確定線程在當前是否存活著(就是要麽是可運行的,要麽是被阻塞了),需要使用isAlive方法。如果是可運行或被阻塞,這個方法返回true; 如果線程仍舊是new狀態且不是可運行的, 或者線程死亡了,則返回false.

二、線程的阻塞方式

  參考:https://blog.csdn.net/wk1134314305/article/details/74094406.html

5. 線程的狀態,和線程的阻塞方式