Handler中有Loop死循環,爲什麼沒有因爲死循環卡死?

今天一個同事去面試,遇到這個問題。

我也不是很明白,去百度一圈,明白個6成,先記錄下來。

這個問題有2個點:死循環 和 卡死。

1、死循環:爲什麼要在ActivityThread中調用Looper.loop創建死循環代碼?

2、卡死是怎麼產生的?

1、死循環:

android在啓動app時候,創建主線程ActivityThread,主線程中執行死循環代碼,作用有2個:

a、保證線程不會死,主線程如果執行結束了,那app就退出了,所以主線程不能死,就依賴這個死循環代碼。

b、持續對Message進行接收、處理、發送,保證handler發過來的message都能及時被處理。

2、卡死:

手機卡死的時候,到底發生了什麼?這跟cpu有關係:

先來認識下cpu的運行空閒機制:比如手機的CPU的頻率是2GHz,這意味着每秒你手機的處理器會執行2^30Hz≈10^9條指令,而大多數時間下手機並不會用到這麼高的計算速度。CPU完成上一個程序的計算任務,直到下一個計算任務被送達,這段時間間隔CPU是沒有任務的狀態,就是cpu空閒狀態。

假設現在共有10個線程在運行,其中包含一個有死循環的線程,假設叫s線程。cpu在執行完其他的線程代碼片段後,s線程立即申請cpu資源,並且是一直不停的申請,沒有給cpu空閒的時間。

導致cpu一直在執行任務,使用率接近100%,cpu滿負載運行,就會出現卡死現象,用戶就會覺得手機卡住了。

回來說,ActivityThread線程中的死循環,之所以沒有卡死,是藉助linux系統的機制,會讓主線程,在無消息時處於休眠狀態,不佔用cpu,而在handler發來Message時候,喚醒主線程,執行對message的接收、分發,處理完畢以後,主線程再次休眠。

這樣就不會卡死了。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章