java線程6種狀態轉換,Java線程的生命周期和各種狀態轉換詳解

1bab94a035328853b68d064028b11baa.gif

在Java中,任何對象都有生命周期,線程也不例外,它也有自己的生命周期。當Thread對象創建完成時,線程的生命周期便開始了,當線程任務中代碼正常執行完畢或者線程拋出一個未捕獲的異常(Exception)或者錯誤(Error)時,線程的生命周期便會結束。

Java官方API將線程的整個生命周期分為六個狀態,分別是NEW(新建狀態)、RUNNABLE(可運行狀態)、BLOCKED(阻塞狀態)、WAITING(等待狀態)、TIMED_WAITING(定時等待狀態)和TERMINATED(終止狀態)。線程的不同狀態表明了線程當前正在進行的活動,在程序中,通過一些操作,可以使線程在不同狀態之間轉換,如圖1所示。

4803aa4c93eb3ba6a89d020950eb3c08.png

圖1 線程狀態轉換圖

圖1中展示了線程各種狀態的轉換關系,箭頭方向表示可轉換的方向。接下來,針對線程生命周期中的六種狀態分別進行詳細講解,具體如下:

1.NEW(新建狀態)

創建一個線程對象后,該線程對象就處于新建狀態,此時它不能運行,和其他Java對象一樣,僅僅由JVM為其分配了內存,沒有表現出任何線程的動態特征。

2.RUNNABLE(可運行狀態)

當新建狀態下的線程對象調用了start()方法,此時就會從新建狀態進入可運行狀態。從圖10-10可以看出,在RUNNABLE狀態內部又可細分成兩種狀態:READY(就緒狀態)和RUNNING(運行狀態),并且線程可以在這兩個狀態之間相互轉換。

● 就緒狀態:線程對象調用start()方法之后,等待JVM的調度,此時線程并沒有運行;

● 運行狀態:線程對象獲得JVM調度,如果存在多個CPU,那么允許多個線程并行運行。

3.BLOCKED(阻塞狀態)

處于運行狀態的線程可能會因為某些原因失去CPU的執行權,暫時停止運行進入阻塞狀態。此時,JVM不會給線程分配CPU,直到線程重新進入就緒狀態,才有機會轉換到運行狀態。阻塞狀態的線程只能先進入就緒狀態,不能直接進入運行狀態。

線程一般會在以下兩種情況下進入阻塞狀態:

● 當線程A運行過程中,試圖獲取同步鎖時,卻被線程B獲取,此時JVM把當前線程A存到對象的鎖池中,線程A就會進入阻塞狀態;

● 當線程運行過程中,發出IO請求時,此時該線程也會進入阻塞狀態。

4.WAITING(等待狀態)

當處于運行狀態的線程調用了無時間參數限制的方法后,如wait()、join()等方法,就會將當前運行中的線程轉換為等待狀態。

處于等待狀態中的線程不能立即爭奪CPU使用權,必須等待其他線程執行特定的操作后,才有機會再次爭奪CPU使用權,將等待狀態的線程轉換為運行狀態。例如,調用wait()方法而處于等待狀態中的線程,必須等待其他線程調用notify()或者notifyAll()方法喚醒當前等待中的線程;調用join()方法而處于等待狀態中的線程,必須等待其他加入的線程終止。

5.TIMED_WAITING(定時等待狀態)

將運行狀態中的線程轉換為定時等待狀態中的線程與轉換為等待狀態中的線程操作類似,只是運行線程調用了有時間參數限制的方法,如sleep(long millis)、wait(long timeout)、join(long millis)等方法。

處于定時等待狀態中的線程也不能立即爭奪CPU使用權,必須等待其他相關線程執行完特定的操作或者限時時間結束后,才有機會再次爭奪CPU使用權,將定時等待狀態的線程轉換為運行狀態。例如,調用了wait(long timeout) 方法而處于等待狀態中的線程,需要通過其他線程調用notify()或者notifyAll()方法喚醒當前等待中的線程,或者等待限時時間結束后也可以進行狀態轉換。

6.TERMINATED(終止狀態)

線程的run()方法、call()方法正常執行完畢或者線程拋出一個未捕獲的異常(Exception)、錯誤(Error),線程就進入終止狀態。一旦進入終止狀態,線程將不再擁有運行的資格,也不能再轉換到其他狀態,生命周期結束。

猜你喜歡:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529354.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529354.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529354.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

window10怎么卸載php,window_win10怎么卸載程序?win10卸載程序教程,當win10正式版發布以后,不少 - phpStudy...

win10怎么卸載程序?win10卸載程序教程當win10正式版發布以后,不少用戶將電腦升級為Windows10系統后,不知道該如何卸載程序,本篇將為大家帶來win10卸載程序教程,希望能夠幫助到大家。win10怎么卸載程序方法一&#xff1…

matlab里dcgain,制系統的時域分析

一個動態系統的性能常用典型輸入作用下的響應來描述。響應是指零初始值條件下某種典型的輸入函數作用下對象的響應,控制系統常用的輸入函數為單位階躍函數和脈沖激勵函數(即沖激函數)。在MATLAB的控制系統工具箱中提供了求取這兩種輸入下系統響應的函數。一、時域分…

php 添加音樂,PHP網站插入音樂

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓你找對地方了,我是IT之家大神光卡蔣一欣。我把代碼發給你,直接運行即可entrance\01.gif......\........\02.gif......\........\03.jpg......\........\04.jpg......\........\05.jpg......\........\06.jpg…

在oracle數據庫中顯示異常,Oracle數據庫出現ORA-01034錯誤的解決方案

類型:數據庫類大小:42.1M語言:中文 評分:5.0標簽:立即下載使用Oracle數據庫的朋友經常會碰到的錯誤ORA-3113 "end of fileon communication channel" 就是這樣的一個,我們可以簡單的把這個錯誤理…

oracle數據庫內核,深入內核:Oracle數據庫里SELECT操作Hang解析

崔華,網名 dbsnakeOracle ACE Director,ACOUG 核心專家編輯手記:感謝崔華授權我們獨家轉載其精品文章,也歡迎大家向“Oracle”社區投稿。我們都知道在 Oracle 數據庫里是“讀不阻塞寫,寫不阻塞讀”,那么是否…

oracle 如何形成死鎖,Oracle數據表中的死鎖情況解決方法

在進行數據庫管理的過程中,經常會出現數據表被用戶的一些不合理操作而導致表被鎖定的情況,以下主要介紹如何查找哪些表被哪個用戶所鎖定,以及如何解除鎖定:1.查找被鎖定的表:select object_name,session_id,os_user_name,oracle_username,process,locked_mode,statusfrom v$loc…

php 分布式數據庫查詢,分布式數據庫 · Thinkphp5.0完全開發手冊 · 看云

# 分布式數據庫ThinkPHP內置了分布式數據庫的支持,包括主從式數據庫的讀寫分離,但是分布式數據庫必須是相同的數據庫類型。配置database.deploy 為1 可以采用分布式數據庫支持。如果采用分布式數據庫,定義數據庫配置信息的方式如下&#xff1…

matlab 電力系統動態仿真,基于Matlab的電力系統動態仿真分析

本文通過兩個簡單實例介紹了利用 !"#$"% &’(! )*, -./對電力系統進行仿真研究的方法! 包括"熱工自動調節控制系統的仿真分析和電力電器系統的仿真分析# 0 熱工調節控制系統仿真分析 對熱工調節控制系統的性能分析包括靜態特性和動態特性兩個方面# 這里主要…

oracle read by other session,AWR報告中,read by other session ,如何解決?

你看你的top sql里全是動態采樣的sql,默認10g以后optimizer_dynamic_sampling參數為level 2,一般為缺失統計信息會造成每次使用動態采樣,雖然動態采樣會在表頻繁發生大批量改變時,一般可以生成更好的執行計劃,但是也不…

oracle insert into as select,比較create table as select * 與 insert into table select *

實驗環境:SYSaaron> select * from v$version;BANNER--------------------------------------------------------------------------------Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - ProductionPL/SQL Release 11.2.0.1.0 - ProductionCORE …

unix 安裝oracle,linux上安裝Oracle

當前位置:我的異常網 Linux/Unix linux上安裝Oraclelinux上安裝Oraclewww.myexceptions.net 網友分享于:2013-09-03 瀏覽:26次linux下安裝Oracle1.Linux下安裝 jdk(Linux)建議從sun的主頁上下載bin文件,運行后在/usr/會建立好java目錄的Linux下相關命…

linux ftp用戶指定多個目錄,linux ftp服務器下用戶限制目錄的方法

我們使用服務器都要站在安全方面進行考慮,有必要將ftp服務下的用戶限制在適當的范圍內,那么linux ftp服務器下用戶限制目錄的方法有哪些呢?一起跟著愛站技術頻道小編的步伐來了解一下吧!linux ftp服務器下用戶只能在自己目錄下的方法:第一步…

查找空目錄Linux,Linux中find批量刪除空文件及空文件夾腳本

find . -name "*" -type f -size 0c | xargs -n 1 rm -f #linux下批量刪除空文件(大小等于0的文件)刪除指定大小的文件,只要修改對應的 -size 參數就行:find . -name "*" -type f -size 1024c | xargs -n 1 rm -f #刪除1k大小的文件…

linux關閉timewait端口,linux 如何強制關閉 time_wait 連接

匿名用戶1級2016-04-16 回答# netstat -an|awk /tcp/ {print $6}|sort|uniq -c68 CLOSE_WAIT2 CLOSING136 ESTABLISHED38 FIN_WAIT116 FIN_WAIT22 LAST_ACK8 LISTEN71 SYN_RECV2936 TIME_WAIT#狀態:描述CLOSED:無連接是活動的或正在進行LISTEN&#xff1…

memset頭文件 linux,error: ‘memset’ was not declared in this scope

http://blog.sina.com.cn/s/blog_79d599dc0100r2vz.html昨天一同事把代碼準備重新全新布置到新的環境上去的時候,代碼報錯了,先開始報錯如下:error: ‘memset’ was not declared in this scopeerror: ‘strcat’ was not declared in this s…

linux中ls文件內存大小,Linux下用ls和du命令查看文件以及文件夾大小

webdriver零碎知識點#零碎知識點,用于記錄平時遇到的比較雜的知識點 driver.current_url 獲取當前url phantomjs 實現無瀏覽器界面自動化測試(driver webdriver.Phanto ...ORACLE刪除當前用戶下所有的表的方法1.如果有刪除用戶的權限,則可以: drop user user_name cascade; 加…

linux物理內存地址與iomem,一種Linux系統物理內存鏡像文件分析方法_4

模塊信息,如圖7所示,給出了本發明的實施例中 模塊結構關系圖,modules變量指向某一個已加載模塊結構體module地址,所有已加載模 塊其module形成一個雙向鏈表,如圖7所示,據此可以獲取到所有已加載模塊。[0099…

linux設備分層優點,Linux設備驅動的分層設計思想

代碼清單8第2行獲取platform_data,而platform_data實際上是定義GPIO按鍵硬件信息的數組,第31行的for循環工具這些信息申請GPIO并初始化中斷,對于LDD6140電路板而言,這些信息如代碼清單10。代碼清單10 LDD6410開發板GPIO按鍵的plat…

linux 關閉桌面環境,Ubuntu 14.04上的Cinnamon桌面環境PPA被關閉

今天Cinnamon桌面環境的開發者宣布關閉Cinnamon桌面環境的PPA,這意味著以后在Ubuntu上安裝Cinnamon桌面環境將變得很難。關于為什么要關閉PPA,Cinnamon PPA的維護者Gwendal Le Bihan做出了以下解釋:“穩定的Cinnamon PPA將不再提供&#xff0…

linux sd卡讀寫出錯,linux系統SD卡讀寫問題

請教有過linux系統SD卡讀寫經驗的前輩。我的項目是對FPGA上的SD卡部分做測試,在測試過程中發現在對SD卡所有領域進行讀寫操作時1、bus width 選擇1-bit的速度4-bit是差不多的,這與我預想的不同,想知道問題出在哪里?(理論上4bit 速度應該是1-…