多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > 新手學JAVA(十一)-多線程----線程的生命周期

新手學JAVA(十一)-多線程----線程的生命周期

來源:程序員人生   發布時間:2016-08-09 08:42:48 閱讀次數:2627次

    • 新建和就緒狀態
    • 運行狀態和阻塞狀態
    • 線程死亡

    當1個線程被創建并啟動以后,其實不是1開始就處于履行狀態,已不是1直處于運行狀態。線程也是有生命周期的,包括:創建(New)、就緒(Runnable)、阻塞(Blocked)、運行(Running)、死亡(Dead)5種狀態。當線程運行時,也不可能1直霸占著CPU獨自運行,而是1直在運行、就緒狀態之間切換。
    

新建和就緒狀態


    當程序通過new創建1個線程時,這個線程就處于新建(New)狀態了,不過這個時候該線程并沒有表現出線程的任何特點,和其他的普通java對象1樣,java虛擬機為其分配內存,并初始化其變量的值。

    當線程對象調用了start()方法以后,該線程就進入了就緒狀態,此時還不是運行狀態,java虛擬機為其創建方法調用棧和程序計數器,此時的線程表示可以運行了,但是具體甚么時候運行,還需要等待jvm的調度。

    有1個需要注意的地方,啟動1個線程需要調用的是start()方法,而不是用run()來啟動線程,如果直接調用run方法的話,系統會把線程當做1個普通的對象,run()方法也只是1個普通的方法。給大家舉個栗子:

package lifecycle; public class InvokeRun extends Thread{ private int i; public void run(){ for(;i<100;i++){ System.out.println(Thread.currentThread().getName() + " " +i); } } public static void main(String[] args){ for(int i=0;i<100;i++){ System.out.println(Thread.currentThread().getName() + " " +i); if(i==20){ new InvokeRun().run(); new InvokeRun().run(); } } } }

    當啟動線程的時候直接用run()方法,終究的結果是:全部程序的運行只有1個線程。程序編程了單線程的了。主要是由于,當你啟動線程的時候,如果調用的start()方法,系統會把run()方法當做線程的履行體。直接調用run()方法的話,在run()方法返回之前其他線程沒法并發運行。

只能對處于新建狀態的線程調用start()方法,否則將引發IllegalThreadStateException異常

    

運行狀態和阻塞狀態


    當1個就緒的線程取得CPU以后,就進入了運行狀態,系統如果只有1個CPU的話,就會出現多個線程在同1個CPU上輪換的現象,1個CPU在任什么時候間只有1個線程在運行。如果有多個CPU的話,就會出現多個線程并行(parallel)履行;
    1個線程不可能1直處于運行狀態,除非這個線程在足夠短的時間內就可以履行完成,否則的話,線程在履行的進程中都會被中斷數次,目的是為了給其他的線程履行的機會,具體的需要斟酌后臺的履行策略。

這里寫圖片描述

    上圖是線程的狀態轉換圖,通過上圖我們就能夠了解到,線程是在甚么條件下進入到阻塞(Blocked)狀態,又在甚么條件下進入到就緒(Runnable)狀態;通過上圖還可以了解到1點,線程其實不是直接從運行狀態轉到就緒狀態的,除yield()方法。
    

    

線程死亡


    線程會以下面3種方式結束,結束后就是死亡狀態。

  1. run()call()方法履行完成,線程正常結束。
  2. 線程拋出1個未捕獲的ExceptionError
  3. 直接調用該線程的stop()方法來結束該線程—-該方法通常容易致使死鎖,不推薦使用。

當線程死亡以后,其他的線程其實不受其影響,而結束。其他的子線程啟動以后,它的地位和主線程是同等的,不受主線程的影響。

    如何測試1個線程是不是已死亡?用線程對象的isAlive()方法來測,當線程處于就緒、運行、阻塞狀態時,返回的結果是true,當線程處于死亡、新建狀態時返回的是false。下面舉1個對已死的線程調用start()方法的例子:

package startDead; public class StartDead extends Thread { private int i; public void run(){ for(;i<100;i++){ System.out.println(getName()+" "+i); } } /** * @param args */ public static void main(String[] args) { StartDead sd =new StartDead(); for(int i=0;i<300;i++){ System.out.println(Thread.currentThread().getName()+" "+i); if(i==20){ sd.start(); System.out.println(sd.isAlive()); } //當i>20的時候,線程肯定已啟動過了,如果sd.isAlive()為假時,那就是死亡狀態了; if(i>20 && !sd.isAlive()){ //試圖再次啟動線程 sd.start(); } } } }

對已死亡的線程調用start()方法,會拋出IllegalThreadStateException異常。

Exception in thread "main" java.lang.IllegalThreadStateException at java.lang.Thread.start(Thread.java:595) at startDead.StartDead.main(StartDead.java:27)

不要試圖對已死亡的線程調用start()方法,死亡就是死亡,死亡的線程不會再次被當做線程的履行體。程序只能對處于新建狀態的線程調用start()方法,對處于新建狀態的線程兩次調用start()也是毛病的,這都會引發IllegalThreadStateException異常

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 成人在线一区二区 | 校园 春色 欧美 另类 小说 | 在线看中文字幕 | jizz在线观看视频 | 亚洲精品中文字幕无乱码 | 久久综合九色综合欧美就去吻 | 国产成人精品一区二三区 | 性欧美大战久久久久久久 | 一级毛片免费毛片毛片 | 成人免费淫片95视频观看网站 | 亚洲国产精品综合久久一线 | xoxoxo日本护士| 成人福利在线免费观看 | 久久精品无遮挡一级毛片 | 综合欧美日韩一区二区三区 | 久久久久久一级毛片免费无遮挡 | 现代激情校园春色 | 久久亚洲成a人片 | 国产一级做a爱片久久片 | 欧美三级视频在线播放 | 中文字幕在线免费观看视频 | 日本护士一级毛片 | 看毛片的网站 | 欧美精品一区二区三区免费播放 | 性欧美videoshd高清 | 日韩欧美伊人久久大香线蕉 | 最近最新中文字幕高清免费 | 精品卡通动漫在线观看视频一区 | 国产精品1区 | 亚洲图片 自拍 | 亚洲欧美偷拍另类 | 国产性一交一乱一伦一色一情 | 国内精品视频在线播放一区 | 三级国产短视频在线观看 | 国内精品久久久久久不卡影院 | 99久久精品国产综合男同 | 午夜亚洲国产理论秋霞 | 亚洲免费久久 | 最近更新中文字幕4 | 日本系列 1页 亚洲系列 | 丁香综合五月 |