HarmonyOS之深入解析线程管理
生活随笔
收集整理的這篇文章主要介紹了
HarmonyOS之深入解析线程管理
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、簡介
- 不同應用在各自獨立的進程中運行。當應用以任何形式啟動時,系統(tǒng)為其創(chuàng)建進程,該進程將持續(xù)運行。當進程完成當前任務處于等待狀態(tài),且系統(tǒng)資源不足時,系統(tǒng)自動回收。
- 在啟動應用時,系統(tǒng)會為該應用創(chuàng)建一個稱為“主線程”的執(zhí)行線程。該線程隨著應用創(chuàng)建或消失,是應用的核心線程。
- UI 界面的顯示和更新等操作,都是在主線程上進行。主線程又稱 UI 線程,默認情況下,所有的操作都是在主線程上執(zhí)行。如果需要執(zhí)行比較耗時的任務(如下載文件、查詢數(shù)據(jù)庫),可創(chuàng)建其他線程來處理。
- 如果應用的業(yè)務邏輯比較復雜,可能需要創(chuàng)建多個線程來執(zhí)行多個任務,這種情況下,代碼復雜難以維護,任務與線程的交互也會更加繁雜。要解決此問題,可以使用“TaskDispatcher”來分發(fā)不同的任務。
二、API 說明
- TaskDispatcher 是一個任務分發(fā)器,它是 Ability 分發(fā)任務的基本接口,隱藏任務所在線程的實現(xiàn)細節(jié)。
- 為保證應用有更好的響應性,需要設計任務的優(yōu)先級。在 UI 線程上運行的任務默認以高優(yōu)先級運行,如果某個任務無需等待結果,則可以用低優(yōu)先級。
- 線程優(yōu)先級說明:
| HIGH | 最高任務優(yōu)先級,比默認優(yōu)先級、低優(yōu)先級的任務有更高的幾率得到執(zhí)行 |
| DEFAULT | 默認任務優(yōu)先級, 比低優(yōu)先級的任務有更高的幾率得到執(zhí)行 |
| LOW | 低任務優(yōu)先級,比高優(yōu)先級、默認優(yōu)先級的任務有更低的幾率得到執(zhí)行 |
- TaskDispatcher 具有多種實現(xiàn),每種實現(xiàn)對應不同的任務分發(fā)器。在分發(fā)任務時可以指定任務的優(yōu)先級,由同一個任務分發(fā)器分發(fā)出的任務具有相同的優(yōu)先級。
- 系統(tǒng)提供的任務分發(fā)器有 GlobalTaskDispatcher、ParallelTaskDispatcher、SerialTaskDispatcher 、SpecTaskDispatcher。
- GlobalTaskDispatcher:全局并發(fā)任務分發(fā)器,由 Ability 執(zhí)行 getGlobalTaskDispatcher() 獲取,適用于任務之間沒有聯(lián)系的情況。一個應用只有一個 GlobalTaskDispatcher,它在程序結束時才被銷毀。
- ParallelTaskDispatcher:并發(fā)任務分發(fā)器,由 Ability 執(zhí)行 createParallelTaskDispatcher() 創(chuàng)建并返回。與 GlobalTaskDispatcher 不同的是,ParallelTaskDispatcher 不具有全局唯一性,可以創(chuàng)建多個,在創(chuàng)建或銷毀 dispatcher 時,需要持有對應的對象引用。
- SerialTaskDispatcher:串行任務分發(fā)器,由 Ability 執(zhí)行 createSerialTaskDispatcher() 創(chuàng)建并返回。由該分發(fā)器分發(fā)的所有的任務都是按順序執(zhí)行,但是執(zhí)行這些任務的線程并不是固定的。
-
- 如果要執(zhí)行并行任務,應使用 ParallelTaskDispatcher 或者 GlobalTaskDispatcher,而不是創(chuàng)建多個 SerialTaskDispatcher。
-
- 如果任務之間沒有依賴,應使用 GlobalTaskDispatcher 來實現(xiàn)。它的創(chuàng)建和銷毀由開發(fā)者自己管理,在使用期間需要持有該對象引用。
- SpecTaskDispatcher:專有任務分發(fā)器,綁定到專有線程上的任務分發(fā)器。目前已有的專有線程為UI線程,通過 UITaskDispatcher 進行任務分發(fā)。
- UITaskDispatcher:綁定到應用主線程的專有任務分發(fā)器, 由 Ability 執(zhí)行 getUITaskDispatcher() 創(chuàng)建并返回。 由該分發(fā)器分發(fā)的所有的任務都是在主線程上按順序執(zhí)行,它在應用程序結束時被銷毀。
三、線程開發(fā)流程
① syncDispatch
- 同步派發(fā)任務:派發(fā)任務并在當前線程等待任務執(zhí)行完成。在返回前,當前線程會被阻塞。
- 如下代碼示例,展示了如何使用 GlobalTaskDispatcher 派發(fā)同步任務:
- 如果對 syncDispatch 使用不當,將會導致死鎖。如下情形可能導致死鎖發(fā)生:
-
- 在專有線程上,利用該專有任務分發(fā)器進行 syncDispatch。
-
- 在被某個串行任務分發(fā)器(dispatcher_a)派發(fā)的任務中,再次利用同一個串行任務分發(fā)器(dispatcher_a)對象派發(fā)任務。
-
- 在被某個串行任務分發(fā)器(dispatcher_a)派發(fā)的任務中,經(jīng)過數(shù)次派發(fā)任務,最終又利用該(dispatcher_a)串行任務分發(fā)器派發(fā)任務。例如:dispatcher_a 派發(fā)的任務使用 dispatcher_b 進行任務的派發(fā),在 dispatcher_b 派發(fā)的任務中又利用 dispatcher_a 進行派發(fā)任務。
-
- 串行任務分發(fā)器(dispatcher_a)派發(fā)的任務中利用串行任務分發(fā)器(dispatcher_b)進行同步派發(fā)任務,同時 dispatcher_b 派發(fā)的任務中利用串行任務分發(fā)器(dispatcher_a)進行同步派發(fā)任務。在特定的線程執(zhí)行順序下將導致死鎖。
② asyncDispatch
- 異步派發(fā)任務:派發(fā)任務,并立即返回,返回值是一個可用于取消任務的接口。
- 如下代碼示例,展示了如何使用 GlobalTaskDispatcher 派發(fā)異步任務:
③ delayDispatch
- 異步延遲派發(fā)任務:異步執(zhí)行,函數(shù)立即返回,內部會在延時指定時間后將任務派發(fā)到相應隊列中。延時時間參數(shù)僅代表在這段時間以后任務分發(fā)器會將任務加入到隊列中,任務的實際執(zhí)行時間可能晚于這個時間。具體比這個數(shù)值晚多久,取決于隊列及內部線程池的繁忙情況。
- 如下代碼示例,展示了如何使用 GlobalTaskDispatcher 延遲派發(fā)任務:
④ Group
- 任務組:表示一組任務,且該組任務之間有一定的聯(lián)系,由 TaskDispatcher 執(zhí)行 createDispatchGroup 創(chuàng)建并返回。將任務加入任務組,返回一個用于取消任務的接口。
- 如下代碼示例展示了任務組的使用方式:將一系列相關聯(lián)的下載任務放入一個任務組,執(zhí)行完下載任務后關閉應用。
⑤ Revocable
- 取消任務:Revocable 是取消一個異步任務的接口。異步任務包括通過 asyncDispatch、delayDispatch、asyncGroupDispatch 派發(fā)的任務。如果任務已經(jīng)在執(zhí)行中或執(zhí)行完成,則會返回取消失敗。
- 如下代碼示例展示了如何取消一個異步延時任務:
⑥ syncDispatchBarrier
- 同步設置屏障任務:在任務組上設立任務執(zhí)行屏障,同步等待任務組中的所有任務執(zhí)行完成,再執(zhí)行指定任務。
- 在全局并發(fā)任務分發(fā)器(GlobalTaskDispatcher)上同步設置任務屏障,將不會起到屏障作用。
- 如下代碼示例展示了如何同步設置屏障:
⑦ asyncDispatchBarrier
- 異步設置屏障任務:在任務組上設立任務執(zhí)行屏障后直接返回,指定任務將在任務組中的所有任務執(zhí)行完成后再執(zhí)行。
- 在全局并發(fā)任務分發(fā)器(GlobalTaskDispatcher)上異步設置任務屏障,將不會起到屏障作用。可以使用并發(fā)任務分發(fā)器(ParallelTaskDispatcher)分離不同的任務組,達到微觀并行、宏觀串行的行為。
- 如下代碼示例展示了如何異步設置屏障:
⑧ applyDispatch
- 執(zhí)行多次任務:對指定任務執(zhí)行多次。
- 如下代碼示例展示了如何執(zhí)行多次任務:
總結
以上是生活随笔為你收集整理的HarmonyOS之深入解析线程管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Swift之深入解析访问控制权限
- 下一篇: HarmonyOS之深入解析线程间的通信