死循化時間片輪轉一直循環不卡死

那爲什麼不會造成應用卡死?
對於線程即是一段可執行的代碼,當可執行代碼執行完成後,線程生命週期便該終止了,線程退出。而對於主線程肯定不能運行一段時間後就自動結束了,那麼如何保證一直存活呢??簡單的做法就是可執行代碼能一直執行下去,死循環便能保證不會被退出,例如:binder線程也是採用死循環方法,通過循環方式不同與Binder驅動進行讀寫操作,當然並非簡單的死循環,無消息時會休眠,但是死循環又如何處理其他事物呢??通過創建新的線程。真正卡死主線程操作的是在回調方法onCreate、onStart、onResume等操作時間過長,會導致掉幀甚至ANR,Looper.loop()本身不會導致應用卡死。
主線程的死循環一直運行會不會特別消耗CPU資源呢?其實不然這裏就涉及到Linux pipe/epoll機制,簡單說就是在主線程的MessageQueue沒有消息時,便阻塞在loop的queue.next()中的nativePollOnce()方法裏,此時主線程會釋放CPU資源進入休眠狀態,直到下個消息到達或者有事務發生,通過往pipe管道寫端寫入數據來喚醒主線程工作。這裏採用的epoll機制,是一種IO多路複用機制,可以同時監控多個描述符,當某個描述符就緒(讀或寫就緒),則立刻通知相應程序進行讀或寫操作,本質同步I/O,即讀寫是阻塞的。 所以說,主線程大多數時候都是處於休眠狀態,並不會消耗大量CPU資源。

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