<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] # Handler原理分析 ## 關鍵流程 1、Looper不斷的從MessageQueue中取出Message,然后交給Message對應的Handler處理。同時Handler還執行發送Message到MessageQueue中的動作。 2、Handler對象持有Looper的目的是為了拿到Looper對應的MessageQueue,并往其中插入消息;Looper從MessageQueue中取出Message后,交給Message的target也就是Handler對象處理。 3、Looper對象存儲在ThreadLocal中,屬于線程局部變量,只能被當前線程訪問。 ## 詳細介紹 1、Handler調用sendMessage、post方法發送Message,并插入到MessageQueue中,MessaQueue采用單鏈表結構。 2、Handler類有一個Looper成員變量,Looper屬于線程局部變量,每個線程有且只能有一個Looper;Looper類有一個MessageQueue成員變量;Handler持有Looper主要是為了拿到Looper對應的MessageQueue,并往其中插入消息。 3、子線程需要先調用Looper.prepare方法,來創建一個Looper對象存儲到ThreadLocal中。然后創建Handler時會調用Looper.myLooper方法獲取當前線程的Looper。 4、Looper.loop方法開啟消息循環,Looper會循環從其MessageQueue中提取消息,并調用消息的target(也就是Handler)進行分發處理 5、Handler拿到Message后,先判斷Message的Callback是否為空,不為空直接執行,消息處理結束;為空則判斷Handler的Callback是否為空,不為空則執行,并決定是否進行攔截,攔截則消息處理結束;不攔截則執行Handler的handleMessage方法。 ## ThreadLocal介紹 1、ThreadLocal是一個創建線程局部變量的類。 2、一般情況下,我們創建的線程可以被任何一個線程訪問并修改,而使用ThreadLocal創建的變量只能被當前線程訪問,其他線程無法訪問和修改。 3、ThreadLocal的set方法存入的值,實際是放到當前線程的ThreadLocalMap實例中,key是當前ThreadLocal對象,value是存入的值。 4、get方法直接從當前線程的ThreadLocalMap中,根據key獲取對象 # 一個線程中初始化多個Handler,會產生多少個Looper 只會產生一個Looper。因為Looper是和當前線程進行綁定的,屬于線程局部變量,每個線程有且只能有一個Looper # 如果只有一個Looper,Looper如何區分Handler,Handler發送了消息會不會導致Looper錯亂,最終不知道誰處理 Handler在將消息插入到消息隊列時,會將消息的target屬性設置為該Handler自身,消息的target屬性為空時是無法插入消息隊列的。Looper取出消息后會調用該消息的target屬性(也就是Handler對象)的dispatchMessage方法來分發消息給相應的Handler。 # 多進程和多線程的區別 1、本質區別在于:每個進程擁有自己的一整套變量,而線程則共享數據。 2、進程是程序的一次執行。計算機在同一刻運行多個程序,每個程序稱為一個進程(計算機將 CPU 的時間片分配給每一個進程) 3、線程是 CPU 的基本調度單位。一個程序同時執行多個任務,每個任務稱為一個線程 # 進程間通訊方法,線程間通訊方法 1、進程間通訊方法: * Broadcast * Intent/Bundle * File 共享 * Messenger * AIDL * ContentProvider * Socket 2、線程間通訊方法: * Handler(AsyncTask、Message、runOnUiThread 等) * EventBus * LocalBroadcast # 關鍵字 synchronized 的作用 # sleep 和 wait 的區別 1、二者都可以暫停當前線程,釋放 CPU 控制權 2、區別在于作用于誰和是否釋放鎖? 3、wait 方法作用于 Object,sleep 方法作用于 Thread Object.wait 方法在釋放 CPU 的同時,釋放了對象鎖的控制,使得其他線程可以使用同步控制塊或方法;Thread.sleep 方法沒有釋放鎖
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看