java thread 線程銷毀_手把手帶你了解Java線程的實現方式及生命周期原理

前言

我們在工作中線程技術很多情況下都能用的到,而且我們在面試的時候,線程技術基本上也是必問的。今天我來從線程的實現方式以及線程的生命周期做一個全面的講解與分析,幫助大家能更好的去了解線程技術。

概念

我們先來了解下線程和進程的概念以及區別:

1、什么是進程

進程是計算機執行應用程序的執行動作。當你運行一個程序的時候也就是完成了一個進程的啟動(比如啟動微信或者QQ)。如圖所示

9158efcb2b14e351166a771035034a49.png

2、什么是線程

線程是進程內獨立運行的一個單位,而進程他可以由一個或者多個線程組成,但是一個線程只能對應一個進程。

如何創建線程

創建線程有繼承Thread類、實現Runnable接口或者通過Callable和Future創建線程三種方法,具體創建過程如下。 本文來源于公眾號:【Java學習提升】?專注于Java領域技術分享,Java知識體系學習、分享面試經驗,讓我們結伴而行,共同成長!

1、繼承Thread類

下面我們通過代碼來看下繼承Thread類創建線程的具體步驟:

首先我們需要定義一個類來集成Thread類,繼承過后需要重寫Thread類的run()方法,代碼如下:

3b9c670156ec8906f0632d1041874120.png

然后我們調用該線程類對象的start()方法來啟動線程,代碼如下:

7d1f2cedef2687660a29551265339a84.png

運行結果如下:

e1fed0b10baee977d5f7f8ce9ee370fc.png

2、實現Runnable接口

我們還可以通過實現Runnable接口來創建線程類,具體如下:

首先我們需要創建一個類來實現Runnable接口,同樣我們也需要重寫run()方法

7ab8f71ced39ec7848942f4be4326386.png

然后我們創建Runnable實現類的對象,把這個實現類的對象作為Thread類的target對象來創建線程,最后得到的Thread類的對象才是真正的線程對象,運行start()方法來啟動線程

e30f0fb8474f519cbb0129e86254f237.png

結果如下:

48315681e00b427506d2fb9078ca48dd.png

3、通過Callable和Future創建線程

首先創建一個類實現Callable接口,并且重寫call()方法

9c89361c7ff261ab894cb549e067f9c2.png

然后使用FutureTask來包裝MyCallable對象,同樣和上面一樣把FutureTask類的對象作為Thread類的target對象來創建線程并用start()方法來啟動。

c3f54e09fe003156dcc248030454c04a.png

通過上面的例子我們發現,已經不是重寫run()方法而是重寫call()方法,并且還能自定義返回值,另外還有一個值得注意的問題是FutureTask實際上是實現了Runnable類并且也繼承了Future接口,很顯然FutureTask具有這兩者的雙重特征。

線程的生命周期

線程的生命周期包含新建狀態、就緒狀態、運行狀態、阻塞狀態和銷毀狀態等5個狀態。

1、新建狀態

我們使用new()方法,讓它有自己的內存空間,這樣new出來的就是線程的新建狀態。

2、就緒狀態

從上面的例子中可以看出,當我們調用start()方法時,就進入了就緒狀態。注意這個時候線程不會立刻執行,而是等待CPU給他分配資源,當獲得了CPU資源就開始執行,這個是面試官經常問的點。

3、運行狀態

當線程獲得CPU的資源時就進入了運行狀態,這里我來重點說明一下運行狀態的線程,面試官經常在這里做文章。

因為處于運行狀態的線程是非常復雜的,它有可能會變成就緒狀態、阻塞狀態或者死亡狀態。

當執行run()方法時,如果線程在運行過程中失去了CPU資源的時候(如調用yield()方法),該線程就會暫停運行,因為線程已經從運行狀態變成了就緒狀態。

那么通過哪些方式能讓線程從運行狀態變成就緒狀態呢?

當正處在運行中的線程調用sleep方法時,會主動放棄占用的系統資源

當正處在運行中的線程調用一個阻塞式IO方法時,如果一直在等待該方法返回值的時候,那么就會造成線程被阻塞

調用yield()方法會暫停當前正在運行的線程

線程正在等待通知(notify)

調用了線程的suspend方法將該線程掛起

當然除了線程在運行狀態變成就緒狀態外,還能直接讓運行狀態的線程變成銷毀狀態,比如線程出現了異常或者調用了stop()、desyory()等方法。

4、阻塞狀態

如果執行了sleep()方法,這時就會讓線程進入阻塞狀態,當然造成這種情況的不只是只有調用sleep方法,比如當等待I/O設備的時候也會造成線程進入阻塞狀態。

5、銷毀狀態

當線程運行結束的時候,或者被強制終止的時候,線程就進入了銷毀狀態。當然還有我們上面提到的運行過程中發生異常的情況、JVM異常結束、調用了stop()、desyory()等方法都會使線程進入銷毀的狀態。注意處于銷毀狀態的線程是不能復活的,如果強制調用start()方法,則會拋出java.lang.IllegalThreadStateException異常。

下面附一張完整的線程生命周期圖:

faad995d9c207c25d1f58cc797cfdb6f.png

總結

希望通過本文能帶大家更好的去了解線程技術、線程與進程的區別、線程的三個實現方法和他們的區別以及線程的生命周期,幫助大家在工作中能更好的去開發程序。

原創聲明:本文為【Java學習提升】原創博文,轉載請注明出處。

本文來源于公眾號:【Java學習提升】?專注于Java領域技術分享,Java知識體系學習、分享面試經驗,讓我們結伴而行,共同成長

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

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

相關文章

python自動化_python自動化測試-Behave框架的用法介紹 - python測試學習

測碼學院 Behave框架的用法介紹眾所周知:行為驅動開發((behavior-drivendevelopment,BDD)是一種基于敏捷軟件開發的方法。它可以鼓勵開發人員,業務參與者和QA人員之間的協作。作為另一個Python自動化測試框架,“Behave”允許團隊…

虛擬按鍵自己觸發的java代碼_在SystemUI添加虛擬按鍵

我們想要在volume、back、menu同一排添加一個虛擬按鍵,并且觸發一個應用;1、首先我們要找到這些虛擬按鍵的位置:\frameworks\base\packages\SystemUI\res\layout-sw600dp\navigation_bar.xml2、橫屏時,最左邊的RelativeLayout 中添…

diskgeniusv4.4.0_入門TensorFlow2.0

今天老師帶領我們入門TensorFlow2.0。至于tensorflow2.0是啥嘛,詳細的可以度娘一下。我簡述一下,就是一個end-to-end machine-Learning open source plantform(端對端的開源機器學習的平臺)。學習tensorflow需要引入tensor這個概念,tensor的漢語意思就是…

java.close用法_void close()

void close()描述 (Description)java.io.FilterInputStream.close()方法關閉此輸入流并釋放與該流關聯的所有系統資源。聲明 (Declaration)以下是public void close()方法的聲明 -public void close()參數 (Parameters)NA返回值 (Return Value)該方法不返回任何值。異常 (Excep…

php 其他頁面獲取session_PHP五十個提升執行效率的小技巧,和常見問題

在項目開發過程中,經常遇到了一些PHP處理程序性能底下的情況,程序運行在centosnginx環境,雖然這個有很多的原因如:服務器本身配置,運行環境nginx服務,php-fpm配置等等,更多有一點仍然是PHPer沒有…

java怎么設置404界面_如何使用Spring MVC顯示自定義的404 Not Found頁面

本篇文章給大家帶來的內容是關于如何使用Spring MVC顯示自定義的404 Not Found頁面,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。不知道大家對千篇一律的404 Not Found的錯誤頁面是否感到膩歪了?其實通過很簡單…

藍牙解碼格式哪個最好_拆解報告:山靈UP2 藍牙音頻接收器

主流手機逐步取消3.5mm接口,不再內置解碼芯片,習慣使用有線耳機、對音質有一定要求的朋友只能選擇音頻轉換線或者藍牙耳機功率放大器這類產品替代。與轉換線相比,藍牙耳機功率放大器采用藍牙無線連接更加自由,體積一般也比較小巧。…

java spring mvc json ajax 優勢_SpringMVC后臺json數據前臺ajax獲取不到!!!急求解答!!!...

//后端RestControllerRequestMapping(value "/loan")public class LoanApplyController extends BaseController {Resourceprivate LoanApplyService loanApplyService;//購車申請審核模塊RequestMapping(value "apply/all", method RequestMethod.GET)…

項目助理這個工作怎么樣_分析微信清理僵尸粉這個項目怎么樣?

做微信清理僵尸粉做微信清理僵尸粉做微信清理僵尸粉本人利用這個方式一年副業賺了10萬01 項目介紹(為什么這個項目受歡迎)現在每個人幾乎都會用到微信,但是時間長了,微信好友都是幾百上千好友(5000是上限)了。但是你有沒有發現,每次跟你微信溝…

php后臺閃退,詳解Cscms V4程序網站后臺登陸出現閃退

最近無憂主機php空間有些站長在使用Cscms V4程序建站,登陸網站后臺的時候出現了閃退的問題,這個問題困惑了很多使用這程序的站長們,因為出現這樣的問題不只是單純的Cscms程序才會出現,比如說Dedemcs、Wordpress等等蠻多的程序同樣…

java 線程安全list_JAVA并發編程實戰-線程安全性

線程安全性:對象的狀態是指存儲在狀態變量(例如實例和靜態域)中的數據。對象的狀態可能包括其他依賴對象的域。例如:某個HashMap的狀態不僅存儲在HashMap對象本身,還存儲在許多Map.Entry對象中。“共享”意味變量可以由…

日文轉換為羅馬音_手把手教你掌握韓語40音!入門必備哦

其實學習韓語還是蠻簡單的,平時看韓劇也能學會幾句比較常用的話~那么接下來我們進入正題,首先你可以根據自己的韓語學習經驗和全網搜集,整理出以下能夠快速學習韓語40音的方法,希望能幫助到更多面對韓語40音迷茫無措的…

php asp 發起post請求,PHP用curl函數POST請求到ASP頁面提示無效請求

如題,一提交即返回以下信息:錯誤您所請求的網址(URL)無法獲取——————————————————————————–當嘗試進行以下請求時:POST /card/pay_card.aspx HTTP/1.0Host: pay.m3guo.comX-Real-IP: 120.31.66.99X-Forwarded-For:…

win7一直顯示正在啟動_win7系統中提高啟動速度并且禁用某些軟件啟動的操作小技巧...

我們在啟動系統時,會出現啟動速度過慢,甚至達到假死機狀態,就是鼠標一直在轉圈圈的等待狀態。出現這個問題,一般是我們電腦中自啟動的軟件過多造成的,解決這個問題我們只要進入系統配置工具中,對系統進行相…

站怎么點都是一樣_抖音怎么做?這幾樣一樣都不能少,你都做到了嗎?

有人說去年是內容爆發年,也有人說今年是內容元年,其實不管哪年都好,反正電商平臺是越來越傾向于內容化運營,包括618都對入場商家的內容化運營有要求,特別是短視頻內容。下面就給大家分享一下如何去做好一個抖音賬號。分…

棧 php 驗證格式,表單驗證 - 《Biny - 高性能輕量級PHP框架》 - 書棧網 · BookStack...

表單驗證框架提供了一套完整的表單驗證解決方案,適用于絕大多數場景。表單驗證支持所有類型的驗證以及自定義方法簡單示例:namespaceapp\form;usebiny\lib\Form;/*** property \app\service\testService $testService* 自定義一個表單驗證類型類 繼承For…

只能獲取fixed語句初始值_因用了Insert into select語句,美女同事被開除了!

點擊上方 web項目開發,選擇 設為星標優質文章,及時送達--Insert into select請慎用。這天xxx接到一個需求,需要將表A的數據遷移到表B中去做一個備份。本想通過程序先查詢查出來然后批量插入。但xxx覺得這樣有點慢,需要耗費大量的網…

python獲取excel數據進行判斷輸出結果到excel,如何使用python xlrd/xlwt從一個excel工作簿提取數據并輸出到另一個excel工作簿?...

我正在為xlutils、xlrd和xlwt創建一個名為excel functions的類,最終我可能會創建一個庫。如果你有興趣幫我做一個刪除工作表的功能。您可能希望轉向openpyxl和/或pyexcel,因為它們更容易實現,并且有相應的功能。如果要從一個excel工作簿提取數…

php中sql格式化字符串,sqli注入-sprintf格式化字符串帶來的注入隱患

PHP中 sprintf()格式化輸出詳解sprintf()函數把格式化的字符串寫入變量中。arg1、arg2、參數將被插入到主字符串中的百分號(%)符號處。該函數是逐步執行的。在第一個%符號處,插入arg1,在第二個%符號處,插入arg2,以此類推。注釋:如…

mybatis依賴_這大概就是公司一直用Mybatis的原因!真的太強了

01 什么是MyBatis、Spring?MyBatis是什么?它是一個SQL Mapping框架,它是一個持久化技術框架。再說得簡單一點,它只不過是一個操作數據庫的框架。Spring是什么?Spring就是一個大容器,不管是IoC還是AOP&#…