今天一個同事去面試,遇到這個問題。
我也不是很明白,去百度一圈,明白個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的接收、分發,處理完畢以後,主線程再次休眠。
這樣就不會卡死了。