android handler怎么切換線程 面試:Handler的工作原理是怎樣的?
面試:Handler的工作原理是怎樣的?Handler機制工作原理:Handler工作流程基本上除開Handler、Looper、Message、MessageQueue四個部分。但我們在護理開發(fā)中,
面試:Handler的工作原理是怎樣的?
Handler機制工作原理:
Handler工作流程基本上除開Handler、Looper、Message、MessageQueue四個部分。但我們在護理開發(fā)中,偶爾會都只會要用Handler和Message兩個類。Message負責消息的均搭載了,里面有個target作用于標志消息,string主要是用于存放內(nèi)容,Handler你們負責消息的分發(fā)和處理。
下面具體給你回答下:
Handler機制是由Looper和MessageQueue來構(gòu)建消息機制的。
MessageQueue:消息隊列。只不過名為隊列,然而事實并非如此它的內(nèi)部存儲結(jié)構(gòu)并不是什么唯一的隊列,而是區(qū)分單鏈表的數(shù)據(jù)結(jié)構(gòu)來存儲消息列表的,其中主要注意有再插入enqueue()和之中飛出帶走并徹底刪除next()兩個方法。
Looper:消息非循環(huán)。MessageQueue來存儲消息,Looper則是以循環(huán)吧的去中搜索如何確定有新消息,如有就去如何處理,若沒有就standby(靜靜的等待)。一個線程創(chuàng)建戰(zhàn)隊Handler時簡單要創(chuàng)建Looper的,否則運行錯誤:RuntimeException:oh,noLooper()wasntapparentlyontothisthread,而且每個線程下只要創(chuàng)建戰(zhàn)隊一個Looper,否則會報錯:RuntimeException:Only oneLoopermay becreatedperthread。
面試中解釋,見意能自己學習總結(jié)一套自己的專屬答案,并再理解透,那樣當碰到這個問題,就能能回答的游刃有余!
如何優(yōu)雅的使用和理解線程池?你怎么看?
要把java線程池表述好因此用好,必須把并發(fā)編程的基礎知識掌握到好,另外把線程池的所有API的官方文檔仔細閱讀理解研究什么一遍。這里把優(yōu)雅的使用線程池的要點總結(jié)不勝感激:
1.弄明白你要用線程池干什么。比如你的目的是把歌詞同步API改造為異步,應該打算并發(fā)幫忙多個外部服務,肯定減少線程的創(chuàng)建戰(zhàn)隊和銷毀以處理用戶請求等。
2.依據(jù)你的不好算項目需求,配置好線程池的參數(shù),具體看以及corePoolSize,maximumPoolSize,阻塞住隊列,keepAliveTime,線程工廠和飽和現(xiàn)象策略(也可以說是RejectedExecutionHandler)。
3.據(jù)你的應用特點部署線程池。有的后臺服務運用適合我在起動的時候最少修改好線程池,在應用的執(zhí)行過程不再繼續(xù)如何修改線程池。有的時候,應用比較適合原先創(chuàng)建一個線程池而且把任務遞交出來,使用以后之后立刻強制銷毀。
4.當你確定并沒有在用線程池之后,肯定全局函數(shù)shutdown()以優(yōu)雅的關閉線程池。shutdown也可以可以保證之前早就再提交到線程池中的任務不可能被丟棄,保證了數(shù)據(jù)安全。
5.當內(nèi)部函數(shù)了shutdown之后,線程池此時巳經(jīng)很可能在執(zhí)行任務,只不過是關了了重新提交任務的入口。如果沒有不需要耐心的等待線程池完全重新開啟,不需要調(diào)用awaitTerminate以等待線程池把隊列中的任務完全處理結(jié)束并且清理過完成,接著才趕往。awaitTerminate順利直接返回了,線程池不算是真的清理干凈了。
總結(jié)歸納一下,線程池通過創(chuàng)建(構(gòu)造方法)、遞交任務(execute)、定期清理(shutdown),耐心的等待定時清理都結(jié)束了(awaitTerminate)的順序動態(tài)鏈接庫API,這樣的不使用線程池才算優(yōu)雅。要想用好java線程池,價值最大化優(yōu)化程序的性能可以不做個參考我公眾號里的分析文章。