Android主線程為什么不因?yàn)長oop死循環(huán)卡死

打開應(yīng)用的時(shí)候都是創(chuàng)建一個(gè)進(jìn)程但汞,主線程采用死循環(huán)保證程序一直執(zhí)行下去壤圃,這種模型是“以事件為驅(qū)動(dòng)”軟件系統(tǒng)的必然結(jié)果捌袜,幾乎存在與任何操作系統(tǒng)和編程語言中。ActivityThread主循環(huán)的消息來自于當(dāng)前進(jìn)程和通過IPC機(jī)制投遞來過的消息(觸摸貌夕、按鍵事件)律歼,通過死循環(huán)looper.loop一直獲取消息,有消息都執(zhí)行我們生命周期方法或者頁面交互啡专,無消息CPU休眠不消耗資源险毁,這都是apk能“動(dòng)起來”根本原因。這些消息告知主線程要執(zhí)行onCreate\onStart\onResume等及其如果在執(zhí)行這些方法時(shí)候消耗時(shí)間過長會(huì)導(dǎo)致ANR或者頁面不流暢们童,所以我們是根據(jù)消息來回饋頁面交互畔况,從這里可以說明looper的死循環(huán)跟主線程卡死不是一回事。

線程與進(jìn)程之間關(guān)系:對(duì)于liux來說區(qū)別在于是否共享資源慧库,對(duì)于CPU來說都是一段可執(zhí)行的代碼跷跪,CPU采用CFS調(diào)度算法,保證每個(gè)task公平享有CPU時(shí)間片齐板。
采用死循環(huán):線程都是一段可執(zhí)行的代碼吵瞻,執(zhí)行完了后線程的生命周期該終止了,如果要保證一直運(yùn)行覆积,都要采用死循環(huán)听皿。
交互產(chǎn)生:回調(diào)onCreate\onStart\onResume等方法操作時(shí)間過長導(dǎo)致掉幀發(fā)生ANR,looper.loop本身不會(huì)導(dǎo)致應(yīng)用卡死宽档∥疽蹋回調(diào)生命周期方法,涉及到ActivityThread里面的ApplicationThread用于接收跨進(jìn)程系統(tǒng)服務(wù)AMS發(fā)送過來的事件吗冤,然后ApplicationThread使用handler發(fā)送消息到主線程管理類ActivityThread執(zhí)行相應(yīng)的生命周期又厉。通過發(fā)送消息來控制生命周期,所以頁面的交互靠底層發(fā)送的消息到主線程來進(jìn)行頁面的變化椎瘟。
消息死循環(huán)和消耗:我們先了解下Loop死循環(huán)原理覆致,當(dāng)在MessageQueue沒有消息或者有延遲執(zhí)行的消息時(shí)候,便會(huì)阻塞在MessageQueue.next方法里的nativePollOnce代碼里面肺蔚。這個(gè)時(shí)候線程都會(huì)釋放CPU資源進(jìn)入休眠狀態(tài)煌妈,直到下一個(gè)消息到達(dá)或者事務(wù)發(fā)生,通過往pipe管道寫端寫數(shù)據(jù)作喚醒線程工作宣羊。這個(gè)采用了epoll機(jī)制璧诵,IO多路復(fù)用機(jī)制,同時(shí)監(jiān)控多個(gè)描述符仇冯,有描述符就緒(讀寫操作)之宿,立刻通知相應(yīng)的用程序進(jìn)行讀寫操作,本質(zhì)IO同步苛坚,讀寫阻塞比被。因?yàn)樗姥h(huán)時(shí)候CPU處于休眠狀態(tài),所以并不會(huì)耗費(fèi)大量資源色难。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市等缀,隨后出現(xiàn)的幾起案子枷莉,更是在濱河造成了極大的恐慌,老刑警劉巖项滑,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件依沮,死亡現(xiàn)場離奇詭異,居然都是意外死亡枪狂,警方通過查閱死者的電腦和手機(jī)危喉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來州疾,“玉大人辜限,你說我怎么就攤上這事⊙媳停” “怎么了薄嫡?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長颗胡。 經(jīng)常有香客問我毫深,道長,這世上最難降的妖魔是什么毒姨? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任哑蔫,我火速辦了婚禮,結(jié)果婚禮上弧呐,老公的妹妹穿的比我還像新娘闸迷。我一直安慰自己,他們只是感情好俘枫,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布腥沽。 她就那樣靜靜地躺著,像睡著了一般鸠蚪。 火紅的嫁衣襯著肌膚如雪今阳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天茅信,我揣著相機(jī)與錄音酣栈,去河邊找鬼。 笑死汹押,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的起便。 我是一名探鬼主播棚贾,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼窖维,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了妙痹?” 一聲冷哼從身側(cè)響起铸史,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎怯伊,沒想到半個(gè)月后琳轿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耿芹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年崭篡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吧秕。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡琉闪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出砸彬,到底是詐尸還是另有隱情颠毙,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布砂碉,位于F島的核電站蛀蜜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏增蹭。R本人自食惡果不足惜滴某,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沪铭。 院中可真熱鬧壮池,春花似錦、人聲如沸杀怠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赔退。三九已至橙依,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間硕旗,已是汗流浹背窗骑。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留漆枚,地道東北人创译。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像墙基,于是被迫代替她去往敵國和親软族。 傳聞我的和親對(duì)象是個(gè)殘疾皇子刷喜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容