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

5. 線程的狀態、線程的阻塞的方式

狀態 time 放棄 start 線程終止 選中 ati tails 使用

Java中線程的狀態分為6種

  1. 初始(NEW)狀態:新創建了一個線程對象,但還沒有調用start()方法。
  2. 運行(RUNNABLE):Java線程中將就緒(ready)和運行中(running)兩種狀態籠統稱為“運行”。線程對象創建後其他線程(比如main線程)調用了該對象的start()方法。該狀態的線程位於可運行線程池中,等待被線程調度選中,獲取cpu的使用權。此時處於就緒狀態(ready)。就緒狀態的線程在獲得cpu時間片後變為運行中狀態(running)
  3. 阻塞(BLOCKED):表示該線程阻塞於鎖
  4. 等待(WAITING):進入該狀態的線程需要等待其他線程做出一些特定動作(通知或終端)
  5. 超時等待(TIME_WAITING):該狀態不同於WAITING,它可以在指定的時間內自行返回
  6. 終止(TERMINATED):表示該線程已經執行完畢

  • 初始狀態
    •   線程的實現有三種方式,一是繼承Thread類,二是實現Runnable接口,三是實現Callable接口,但是不管如何,當我們new了這個對象之後,線程就進入了初始化狀態。
  • 就緒狀態
    •   線程被new出來,調用start()方法,此線程進入就緒狀態
    • 當前線程sleep()方法結束,其他線程join()方法,等待用戶輸入完畢,某個線程拿到對象鎖,這些線程也將進入就緒狀態
    • 當前線程時間片用完了,調用當前線程的yield()方法,當前線程進入就緒狀態。
    • 鎖池裏的線程拿到對象鎖後,進入就緒狀態。
    • 該狀態的線程位於“可運行線程池”中,變得可運行、只等待獲取CPU的使用權,即在就緒狀態的進程除CPU之外,其他的運行所需資源都已全部獲得。
  • 運行中狀態
    •   線程調度程序從可運行池中選擇一個線程作為當前線程時線程所處的狀態。
  • 阻塞狀態
    •   阻塞狀態是線程因為某種原因放棄CPU使用權,暫時停止運行。知道線程進入就緒狀態,才有機會轉到運行狀態。
    • 阻塞的情況分三種
      •   等待阻塞:運行的線程執行wait()方法,該線程會釋放占用的所有資源,JVM會把該線程放入“等待池”中。進入這個狀態後,是不能自動喚醒的,必須依靠其他線程調用notify()或notifyAll()方法才能被喚醒
      • 同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用,則JVM會把該線程放入“鎖池”中。
      • 其他阻塞:運行的線程執行sleep()方法或join()方法,或者發出了I/O請求時,JVM會把該線程置為阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉入就緒狀態。
  • 終止狀態
    • 當線程的run()方法完成時,或者主線程的main()方法完成時,我們就認為它終止了。這個線程對象也許是活的,但是,它已經不是一個單獨執行的線程。線程一旦終止了,就不能復生。

  狀態圖:

  技術分享圖片

  當等待隊列裏有許多的線程都wait()在一個對象時,此時某一個線程調用了對象的notify()方法,那喚醒的到底是哪個線程?

  The choice is arbitrary and occurs at the discretion of the implementation.

參考文檔:

http://ifeve.com/%E6%B3%A5%E7%93%A6%E5%8C%A0%E8%81%8A%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%EF%BC%9A%E7%BA%BF%E7%A8%8B%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%BF%85%E7%9F%A5%E5%BF%85%E4%BC%9A%EF%BC%88%E5%9F%BA%E7%A1%80/

https://blog.csdn.net/huakai_sun/article/details/78287931

https://blog.csdn.net/pange1991/article/details/53860651/

https://www.cnblogs.com/jijijiefang/articles/7222955.html

5. 線程的狀態、線程的阻塞的方式