handlerthread、handler、looper、messagequeue相互關聯對應
queue是通過msg.next指向下乙個msg來實現,mmessages代表當前的message,每取出乙個msg,移動一次mmessages,一直到最後乙個msg
handlerthread是乙個執行緒,做的事情就是讓looper迴圈在messagequeue中找下乙個message(上圖中的mmessages一直往後移動)
在移動的過程中:
1. 如果有message,就在handler中執行message中的callback或者runnable.run(),然後繼續找下乙個message
2. 如果message=null(handlerthread呼叫quit()方法後,會在查詢msg的過程中直接返回null),則跳出迴圈,handlerthread就執行完了,
並不是沒找到msg就返回null:
在next()的過程中,如果沒有找到message,還會進行一次迴圈
而在這次迴圈中,nextpolltimeoutmills=-1,mblocked=true,nativepollonce()會把執行緒中斷下來,此時不會返回msg,而是被中斷下來了。
來訊息的時候,(由於之前mblocked=true,所以)會nativewake()喚醒執行緒,
不過都是在這兩個native方法都是messagequeue中進行的
以此達到節省資源的目的
由於**中有native方法,初看的時候會認為handlerthread一直在迴圈取queue中的msg,(這樣說來,該執行緒一直在占有時間片,而又沒處理實際的任務,效率實在地下)(該理解是錯誤的)
再看的時候會發現,如果沒有取到msg,該handlerthread的run方法就會走完,也就是說,thread走完之後會停止(這樣說來,一旦queue中的msg被取完,handlerthread就停止了,那,再次sendmessage的時候,又如何會執行?)(該理解是錯誤的)
直到除錯發現,在沒有msg的時候會進行中斷,來了msg的時候又會喚醒。
於是效率並不成問題
那麼,該handlerthread什麼時候會結束呢,
前面說過:handlerthread有個quite方法,該方法會改變乙個標記位,這個標記位被改變後,queue迴圈查詢下乙個msg的時候會直接返回null,looper迴圈處理msg的時候發現msg=null,然後會跳出迴圈,而handlerthread的存活就是靠run()方法中 looper的死迴圈的,一旦迴圈跳出,那麼說run方法就會直接走完,到此執行緒結束。
站長,你還為寫不出原創而擔心麼
原創原創聽到這二個詞,你就沒有心思,這個原創寫出不來呀?有乙個朋友問到 寫軟文要什麼文化的?像我初中可以嗎?張勝榮回覆是 初中文化就夠了,寫文章沒有說是文憑說法,簡單而且實用就ok了。其實我也沒有讀完初中。當然,乙個大生生寫的話文采方面的會很得的寫好,我相信總有一天,會向大學一www.cppcns....
關於選用ccflow你所擔心的問題都在這裡為您解答
致ccflow客戶 感謝大家ccbpm的認可,我們會一如既往的以踏實的技術來回應大家的支援。針對大家疑問最多的幾個問題,在這裡我我為大家一一解答。一直在更新,不穩定問題 版本控制我們做的差,是因為我們支援太多的客戶,他們要我們第一時間響應需求實現。這些找我們技術支援的客戶幾乎都是給原有功能公升級和新...
我所擔心的噩夢
生活中總有一些讓自己無法放下的事情 如果是別人發現真實的自己是多麼大的乙個小人,偽君子,自己會怎樣想?在很多不為人知的瞬間做著一些見不得人的事。其實自己本來就沒有想象中的那樣的偉大,只是再普通的人中的乙個而已,也是有七情六慾,也有不能控制的時候。如果明天就離開自己的工作,到底是什麼讓自己依然留在這個...