淺析java中的線程狀態,java線程的狀態有哪些

本文目錄一覽:

談談OpenJDK中線程的9種狀態

我在在查找了很多資料還有根據書籍,發現對於線程的狀態,網上的說法各種各樣的,這裡就想做一個總結。

在jdk1.8 的源碼當中,java中線程(Thread)的狀態,注釋里說的很清楚了,沿用的是1.5的,主要分為6種狀態,每種狀態之間都可以隨着操作進行相互轉換。後面會有OpenJDK的說法,一共是九種,別著急。

1.新建狀態(New):

新創建了一個線程對象這個時候沒有對他調用和執行。

2.運行中狀態 RUNNABLE:

該狀態可以被看成一 個複合狀態。它包括兩個子狀態 :READY和RUNNING。前者表示處於該狀態的線程可以被線程調度器(Scheduler)進行調度而使之處於RUNNING狀態。後者表示處於該狀態的線程正在運行,即相應線程對象的run方法所對應的指令正在由處理器執行。執行Thread.yield()的線程,其狀態可能會由RUNNING轉換為READY。處於READY子狀態的線程也被稱為活躍線程。

3.阻塞狀態 BLOCKED:

一 個線程發起一個阻塞式 1/0 (Blocking I/0)操作後 12 , 或者申請一個由其他線程持有的獨佔資源(比如鎖)時,相應的線程會處於該狀態。處於BLOCKED狀態的線程並不會佔用處理器資源。當阻塞式I/0操作完成後,或者線程獲得了其申請的資源,該線程的狀態又可以轉換為RUNNABLE。

一 個線程執行了某些特定方法之後就會處於這種等待其他線程執行另外一些特定操作的狀態。能夠使其執行線程變為WAITING狀態的方法包括Object. wait()、 Thread.join()、LockSupport.park(Object)。能夠使相應線程從WAITING變更為RUNNABLE的相應方法包括: Object.notify()/notify All()和LockSupport. unpark(Object))。

該狀態和WAITING類似,差別在於處於該狀態的線程並非尤限制地等待其他線程執行特定操作,而是處於帶有時間限制的等待狀態。當其他線程沒有在指定時間內執行該線程所期望的特定操作時,該線程的狀態自動轉換為RUNNABLE。

6.終止狀態 TERMINATED:

已經執行結束的線程處於該狀態。由於一 個線程實例只能夠被啟動一 次,因此一 個線程也只可能有一次處於該狀態。Thread.run()正常返回或者由於拋出異常而提前終止都會導致相應線程處於該狀態。

附上源碼

public enum State {

/**

* Thread state for a thread which has not yet started.

*/

NEW,

以上是在JDK1.8中的Thread源碼中備註的。

然而也有一種說法,在JVM中對狀態的定義是九種,這裡說的是在OpenJDK中的

2.運行 (RUNNABLE):筆者的理解就是,start之後線程進入到run方法,執行run方法的狀態,也就是網上所說的準備(ready)和運行(running);

3.睡眠(SLEEPING):線程調用sleep(),之後抱鎖等待的狀態;

4.對象等待(IN_OBJECT_WAIT):也就是對象調用wait()方法之後的釋放鎖等待;

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

6.掛起(PARKED):該狀態是線程沒有拿到鎖之後,進入等待隊列之後一直處於掛起狀態;

7.掛起超時(PARKED_TIMED):該狀態不同於PARKED,它可以在指定的時間後自行解除掛起

8.阻塞監視(BLOCKED_ON_MONITOR_ENTER):進入同步之後的狀態,也就是線程進入到同步塊中,或者同步鎖中的狀態,讀者也可以理解為線程進入獨佔模式下的狀態;

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

java線程運行怎麼有第六種狀態

其實線程只有”就緒”、”阻塞”、”運行”三種狀態:

1. 運行狀態,線程正在幹活的狀態

2. 就緒狀態,CPU正在忙活別的,線程搖晃着一個”恭候您光臨”的小旗子的狀態

3. 阻塞狀態,線程主動讓出CPU資源,搖晃着一個”我這會還不能出台您稍後再來”的小旗子的狀態

“新建”和”終止”這兩種狀態其實並不是線程的狀態,而是java.lang.Thread對象的狀態。可以說,處於”新建”和”終止”狀態的”線程”其實並不是線程,而只是一個代表着線程對象而已。

所以我們把”新建(NEW)”和”終止(TERMINATED)”兩種狀態去掉,那麼Java定義的線程狀態還有4種:

1. RUNNABLE

2. BLOCKED

3. WAITING

4. TIMED_WAITING

這四種狀態怎麼對應到”就緒”、”阻塞”、”運行”這三種狀態里呢:

1. RUNNABLE,對應”就緒”和”運行”兩種狀態,也就是說處於就緒和運行狀態的線程在java.lang.Thread中都表現為”RUNNABLE”

2. BLOCKED,對應”阻塞”狀態,此線程需要獲得某個鎖才能繼續執行,而這個鎖目前被其他線程持有,所以進入了被動的等待狀態,直到搶到了那個鎖,才會再次進入”就緒”狀態

3. WAITING,對應”阻塞”狀態,代表此線程正處於無限期的主動等待中,直到有人喚醒它,它才會再次進入就緒狀態

4. TIMED_WAITING,對應”阻塞”狀態,代表此線程正處於有限期的主動等待中,要麼有人喚醒它,要麼等待夠了一定時間之後,才會再次進入就緒狀態

Java中線程的幾種可用狀態有哪些?請大家解釋一下。

線程在執行過程中,可以處於下面幾種狀態:

1、就緒(Runnable):線程準備運行,不一定立馬就能開始執行。

2、運行中(Running):進程正在執行線程的代碼。

3、等待中(Waiting):線程處於阻塞的狀態,等待外部的處理結束。

4、睡眠中(Sleeping):線程被強制睡眠。

5、I/O阻塞(BlockedonI/O):等待I/O操作完成。

6、同步阻塞(BlockedonSynchronization):等待獲取鎖。

7、死亡(Dead):線程完成了執行。

JAVA中線程有哪五個基本狀態?它們之間如何讓轉化?

java中,每個線程都需經歷新生、就緒、運行、阻塞和死亡五種狀態,線程從新生到死亡的狀態變化稱為生命周期。

用new運算符和Thread類或其子類建立一個線程對象後,該線程就處於新生狀態。

新生—就緒:通過調用start()方法

就緒—運行:處於就緒狀態的線程一旦得到CPU,就進入運行狀態並自動調用自己的run()方法

運行—阻塞:處於運行狀態的線程,執行sleep()方法,或等待I/O設備資源,讓出CPU並暫時中止自己運行,進入阻塞狀態

阻塞—就緒:睡眠時間已到,或等待的I/O設備空閑下來,線程便進入就緒狀態,重新到就緒隊列中等待CPU。當再次獲得CPU時,便從原來中止位置開始繼續運行。

運行—死亡:(1)(正常情況下)線程任務完成

(2)(非正常狀況)線程被強制性的中止,如通過執行stop()或destroy()方法來終止一個線程

JAVA中,線程有哪五個基本狀態?他們之間如何讓轉化?並簡述線程周期。

java中,每個線程都需經歷新生、就緒、運行、阻塞和死亡五種狀態,線程從新生到死亡的狀態變化稱為生命周期。

用new運算符和Thread類或其子類建立一個線程對象後,該線程就處於新生狀態。

線程的生命周期,把圖轉化為文字就是: 

1、線程通過new方法創建,調用start,線程進入就緒狀態,等待系統的調度(時間片輪轉調度)。當系統調度,進入運行狀態。正常結束或者異常退出,進程進入死亡狀態。

2、處於運行狀態的線程若遇到sleep,則線程進入睡眠狀態,不會讓出資源鎖,sleep結束,線程轉為就緒狀態,等待系統重新調度。

3、處於運行狀態的線程可能在等待io,也可能進入掛起狀態。io完成,轉為就緒狀態。

4、處於運行狀態的線程yield,線程轉為就緒狀態。(yield只讓給權限比自己高的)

5、處於運行狀態的線程遇到wait,線程處於等待狀態,需要notify()/notifyALL來喚醒線程,喚醒後的線程處於鎖定狀態,獲取了「同步鎖」,之後,線程才轉為就緒狀態。處於運行的線程synchronized,加上後 變成同步操作。處於鎖定狀態,獲取了「同步鎖」,之後,線程才轉為就緒狀態。

線程有幾種狀態?

Java中的線程的生命周期大體可分為5種狀態。

1、新建(NEW):新創建了一個線程對象。

2、可運行(RUNNABLE):線程對象創建後,其他線程(比如main線程)調用了該對象的start()方法。該狀態的線程位於可運行線程池中,等待被線程調度選中,獲取cpu的使用權。

3、運行(RUNNING):可運行狀態(runnable)的線程獲得了cpu時間片(timeslice),執行程序代碼。

4、阻塞(BLOCKED):阻塞狀態是指線程因為某種原因放棄了cpu使用權,也即讓出了cpu timeslice,暫時停止運行。直到線程進入可運行(runnable)狀態,才有機會再次獲得cpu timeslice轉到運行(running)狀態。

阻塞的情況分三種:

(一).等待阻塞:運行(running)的線程執行o.wait()方法,JVM會把該線程放入等待隊列(waitting queue)中。

(二).同步阻塞:運行(running)的線程在獲取對象的同步鎖時,若該同步鎖被別的線程佔用,則JVM會把該線程放入鎖池(lock pool)中。

(三).其他阻塞:運行(running)的線程執行Thread.sleep(long ms)或t.join()方法,或者發出了I/O請求時,JVM會把該線程置為阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉入可運行(runnable)狀態。

5、死亡(DEAD):線程run()、main()方法執行結束,或者因異常退出了run()方法,則該線程結束生命周期。死亡的線程不可再次復生。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/157496.html

(1)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-18 20:00
下一篇 2024-11-18 20:00

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發佈。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Python 常用數據庫有哪些?

    在Python編程中,數據庫是不可或缺的一部分。隨着互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的數據庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • Python通配符有哪些

    Python通配符是一種表示字符串中模糊匹配的有效工具,用於匹配與具有特定模式匹配的字符串。Python中主要的通配符有:*,?,[]和{}。 一、星號通配符 * 在Python中…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29

發表回復

登錄後才能評論