前言
我們已知線程的三種創(chuàng)建方式:繼承Thread焰檩,實(shí)現(xiàn)Runnable,實(shí)現(xiàn)Callable
鏈接:http://www.reibang.com/p/620ad2380145
該多線程系列是基于只有一個(gè)單核CPU來講的叛薯,單核CPU上運(yùn)行的多線程程序, 同一時(shí)間只能一個(gè)線程在跑, 系統(tǒng)幫你切換線程而已, 系統(tǒng)給每個(gè)線程分配時(shí)間片來執(zhí)行, 每個(gè)時(shí)間片大概2~10ms左右, 看起來像是同時(shí)跑, 但實(shí)際上是每個(gè)線程跑一點(diǎn)點(diǎn)就換到其它線程繼續(xù)跑
線程被創(chuàng)建并啟動(dòng)以后,它并不是一啟動(dòng)就進(jìn)入了執(zhí)行狀態(tài)知牌,也不是一直處于執(zhí)行狀態(tài)丹拯,線程也是有生命周期的站超。線程生命周期有5種狀態(tài):新建(New),就緒乖酬,運(yùn)行死相,阻塞,死亡咬像。
一. 新建
當(dāng)程序使用new 關(guān)鍵字創(chuàng)建了一個(gè)線程之后算撮,該線程就處于新建狀態(tài)。
處于新建狀態(tài)县昂,和其他Java對(duì)象一樣肮柜,僅僅由虛擬機(jī)為其分配內(nèi)存,并初始化成員變量的值倒彰,不會(huì)有任何線程的動(dòng)態(tài)特征审洞。
二. 就緒
線程調(diào)用start()方法后,該線程就處于就緒狀態(tài)待讳。
線程處于就緒狀態(tài)并不會(huì)立即進(jìn)入運(yùn)行狀態(tài)芒澜,至于程序何時(shí)開始運(yùn)行,取決于JVM線程調(diào)度器的調(diào)度创淡。
就緒和運(yùn)行狀態(tài)之間的轉(zhuǎn)換不受程序控制痴晦,由系統(tǒng)線程調(diào)度所決定,就緒狀態(tài)獲得處理器資源后才進(jìn)入運(yùn)行狀態(tài)琳彩。
如果在主線程里希望調(diào)用子線程的start()方法后子線程立即進(jìn)入運(yùn)行狀態(tài)誊酌,可以使用主線程的Thread.sleep(1)睡眠1毫秒,在主線程阻塞1秒期間露乏,CPU會(huì)去執(zhí)行另一個(gè)處于就緒狀態(tài)的線程碧浊,這樣相當(dāng)于子線程立即進(jìn)入運(yùn)行狀態(tài)。
注意:只能對(duì)處于新建狀態(tài)的線程調(diào)用start()方法施无,不然會(huì)報(bào)IllegalThreadStateException異常
三. 運(yùn)行
如果處于就緒狀態(tài)的線程獲得了CPU辉词,開始執(zhí)行run()方法或call()方法的線程執(zhí)行體,則該線程處于運(yùn)行狀態(tài)猾骡。
一個(gè)線程開始運(yùn)行后瑞躺,不可能一直處于運(yùn)行狀態(tài)(除非它的線程執(zhí)行體時(shí)間足夠短,瞬間就執(zhí)行結(jié)束)兴想,線程在運(yùn)行過程中需要被中斷
四. 阻塞
線程在運(yùn)行中被中斷幢哨,使其他線程獲得執(zhí)行的機(jī)會(huì),這個(gè)時(shí)候稱為阻塞嫂便。
阻塞解除——>就緒狀態(tài)——>運(yùn)行狀態(tài)
常見被阻塞并以及解除阻塞重新進(jìn)入就緒狀態(tài)的方法:
- 調(diào)用sleep()方法
調(diào)用sleep()方法的線程經(jīng)過了指定時(shí)間捞镰。 - 調(diào)用阻塞式IO方法,在該方法返回之前,該線程被阻塞
線程調(diào)用的阻塞式IO方法已經(jīng)返回岸售。 - 線程試圖獲得一個(gè)同步監(jiān)視器践樱,但該同步監(jiān)視器被其他線程所持有
線程成功獲得了試圖取得的同步監(jiān)視器。 - 線程在等待某個(gè)通知(notify)
線程正在等待某個(gè)通知時(shí)凸丸,其他線程發(fā)出了一個(gè)通知拷邢。
注意sleep()方法和yield()方法,yield()方法不是阻塞屎慢,而是直接進(jìn)入就緒狀態(tài)瞭稼。
五. 死亡
- run()或call()方法執(zhí)行完成,線程正常結(jié)束腻惠。
- 線程拋出一個(gè)未捕獲的Exception或Error环肘。
調(diào)用線程對(duì)象的isAlive()方法可判斷線程是否死亡,線程處于就緒集灌,運(yùn)行悔雹,阻塞三種狀態(tài)時(shí)返回true,處于新建和死亡時(shí)欣喧,返回false
注意:已經(jīng)死亡的線程不能調(diào)用start()方法荠商,會(huì)報(bào)IllegalThreadStateException異常,即已死亡的線程無法再次運(yùn)行续誉。
只能對(duì)新建狀態(tài)的線程調(diào)用start()方法
上一篇:Android多線程(一)——線程的創(chuàng)建方式:http://www.reibang.com/p/620ad2380145
下一篇:Android多線程(三)——線程控制:
http://www.reibang.com/p/3f4ed4296169