java線程狀態及轉換,java線程狀態和操作系統線程狀態

本文目錄一覽:

java線程中的幾種狀態以及相互轉換

NEW: 線程創建之後,但是還沒有啟動(not yet started)。

RUNNABLE: 正在Java虛擬機下跑任務的線程的狀態。在RUNNABLE狀態下的線程可能會處於等待狀態, 因為它正在等待一些系統資源的釋放,比如IO

BLOCKED: 阻塞狀態,等待鎖的釋放,比如線程A進入了一個synchronized方法,線程B也想進入這個方法,但是這個方法的鎖已經被線程A獲取了,這個時候線程B就處於BLOCKED狀態

WAITING: 等待狀態,處於等待狀態的線程是由於執行了3個方法中的任意方法。 1. Object的wait方法,並且沒有使用timeout參數; 2. Thread的join方法,沒有使用timeout參數 3. LockSupport的park方法。 處於waiting狀態的線程會等待另外一個線程處理特殊的行為。 再舉個例子,如果一個線程調用了一個對象的wait方法,那麼這個線程就會處於waiting狀態直到另外一個線程調用這個對象的notify或者notifyAll方法後才會解除這個狀態

TIMED_WAITING: 有等待時間的等待狀態,比如調用了以下幾個方法中的任意方法,並且指定了等待時間,線程就會處於這個狀態。 1. Thread.sleep方法 2. Object的wait方法,帶有時間 3. Thread.join方法,帶有時間 4. LockSupport的parkNanos方法,帶有時間 5. LockSupport的parkUntil方法,帶有時間

TERMINATED: 線程中止的狀態,這個線程已經完整地執行了它的任務

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

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

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

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

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

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

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

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

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

談談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):表示該線程已經執行完畢;

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-11 13:44
下一篇 2024-11-11 13:44

相關推薦

  • 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
  • Java判斷字元串是否存在多個

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

    編程 2025-04-29
  • 如何安裝Ubuntu操作系統

    Ubuntu是一種基於Linux的操作系統,如今在開源社區中被廣泛使用。相較於其他操作系統,Ubuntu具有更好的安全性、穩定性和定製性等特點。以下是安裝Ubuntu的詳細過程。 …

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

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

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29

發表回復

登錄後才能評論