广西十一选五玩法|广西十一选五开奖查询
  • 怎樣在Android面試中聊聊多線程

    發布:51Code 時間: 2019-07-31 11:32

  • 多線程可以說是Android面試的高頻問題了, 而多線程涉及的內容非常多, 因此在面試當中往往不知道從何說起, 本文并不是為了科普多線程或者研究多線程的知識, 而是嘗試組織語言以便在...

  • 多線程可以說是Android面試的高頻問題了, 而多線程涉及的內容非常多, 因此在面試當中往往不知道從何說起, 本文并不是為了科普多線程或者研究多線程的知識, 而是嘗試組織語言以便在面試當中更好地忽悠面試官.

    語言表達在面試當中雖說很重要, 不過更重要的還是相關知識技能過硬.

    假如在一場Android面試當中, 面試官讓你聊聊多線程, 你可以試試這樣回答.

    Android中的線程

    在Android當中, 當應用啟動的時候, 系統會給應用分配一個進程, 順便一提, 大部分應用都是單進程的, 不過也可以通過設置來使不同組件運行在不同的進程中, 在創建進程的同時會創建一個線程, 應用的大部分操作都會在這個線程中運行, 所以稱為主線程, 同時所有的UI控件相關的操作也要求在這個線程中操作, 所以也稱為UI線程.

    UI線程和工作線程

    因為所有的UI控件的操作都在UI線程中執行, 如果在UI線程中執行耗時操作, 例如網絡請求等, 就會阻塞UI線程, 導致系統報ANR(Application Not Response)錯誤. 因此對于耗時操作需要創建工作線程來執行而不能直接在UI線程中執行. 這樣就需要在應用中使用多線程, 但是Android提供的UI工具包并不是線程安全的, 也就是說不能直接在工作線程中訪問UI控件, 否則會導致不能預測的問題, 因此需要額外的機制來進行線程交互, 主要是讓其他線程可以訪問UI線程.

    線程交互 - Handler機制

    在Android當中, 工作線程主要通過Handler機制來訪問UI線程. 當然還有一些封裝好的類例如AsyncTask可以使用, 但是本質仍是使用Handler.

    Handler機制主要由4部分組成, Looper, 消息隊列, 消息類和Handler組成, 其中Looper和消息隊列是和線程綁定的, 每個線程只會有一個Looper和一個消息隊列, 當Looper啟動時, 它會無限循環嘗試從消息隊列中獲取消息實例, 如果沒有消息則會阻塞等待. 當Handler發送消息時會把消息實例放入消息隊列中, Looper從中取得消息實例然后就會調用Handler的相關方法, 因為Looper是線程綁定的, 如果綁定的是UI線程, 那么此時Handler的方法就會在UI線程中得到執行, 線程間就是這樣進行交互的.

    java中的線程

    而Handler機制的底層實現則是使用java多線程相關的類.

    java當中主要使用Thread和Executor來實現多線程. Thread用于直接創建線程, 在Android中也可以直接使用這個類, Looper中就包含一個Thread實例. Executor是一個接口, 大部分java中自帶的實現都使用了線程池來管理多線程.

    線程池

    因為在系統中創建線程是一個比較耗費資源的事, 所以不能頻繁創建和釋放線程, 因此在效率上考慮通常會使用線程池, 同時也便于線程的管理. Android中的AsyncTask就使用了線程池.

    線程安全

    另一個在使用多線程時需要注意的是線程安全的問題, 因為同一進程中的線程可以共享內存, 雖然這種方式效率很高, 但是會導致線程干擾和內存一致性的問題.

    解決這些問題的主要方法是使用Synchronized關鍵字來加鎖. 基本原理就是線程要對對象進行操作前需要先獲取鎖, 如果一個線程正在操作某個對象, 那么它就會持有相應的鎖, 后來的線程想要操作這個對象, 只能等待前面的線程釋放鎖之后才有機會獲取鎖并進行操作.

    死鎖和活鎖

    引入鎖之后仍有可能出現一些問題, 例如死鎖, 饑餓(Starvation)和活鎖.

    多線程工具包

    同時java還提供不少工具來使用多線程, 例如剛剛提到的Executor, 另外常用的還有線程安全的集合, 例如ConcurrentMap, 可以用來避免內存一致性的問題.

    文章來源:網絡 版權歸原作者所有
    如涉及知識產權問題,請權利人聯系博為峰小編(021-64471599-8103),我們將立即處理。
  • 上一篇:Android防護相關知識點掃盲

    下一篇:沒有了

網站導航
Copyright(C)51Code軟件開發網 2003-2019 , 滬ICP備05003035號-6
广西十一选五玩法 时时彩开奖结果 飞禽走兽怎么压能赢 街机动物狂欢怎么赢钱 传奇国际电子平台 捕鱼世界注册账号 北京快三开奖结果 足球90分钟纯比分 极速时时开奖官网 2018世界杯投注站app 福建快三推荐一二同号