色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

鴻蒙OS 線程管理開發指導

王程 ? 2024-01-29 16:22 ? 次閱讀

場景介紹

如果應用的業務邏輯比較復雜,可能需要創建多個線程來執行多個任務。這種情況下,代碼復雜難以維護,任務與線程的交互也會更加繁雜。要解決此問題,開發者可以使用“TaskDispatcher”來分發不同的任務。

接口說明

TaskDispatcher 是一個任務分發器,它是 Ability 分發任務的基本接口,隱藏任務所在線程的實現細節。

為保證應用有更好的響應性,我們需要設計任務的優先級。在 UI 線程上運行的任務默認以高優先級運行,如果某個任務無需等待結果,則可以用低優先級。

優先級 詳細描述
HIGH 最高任務優先級,比默認優先級、低優先級的任務有更高的幾率得到執行。
DEFAULT 默認任務優先級, 比低優先級的任務有更高的幾率得到執行。
LOW 低任務優先級,比高優先級、默認優先級的任務有更低的幾率得到執行。

TaskDispatcher 具有多種實現,每種實現對應不同的任務分發器。在分發任務時可以指定任務的優先級,由同一個任務分發器分發出的任務具有相同的優先級。系統提供的任務分發器有 GlobalTaskDispatcher、ParallelTaskDispatcher、SerialTaskDispatcher 、SpecTaskDispatcher。

  • GlobalTaskDispatcher
    全局并發任務分發器,由 Ability 執行 getGlobalTaskDispatcher()獲取。適用于任務之間沒有聯系的情況。一個應用只有一個 GlobalTaskDispatcher,它在程序結束時才被銷毀。
 TaskDispatcher globalTaskDispatcher = getGlobalTaskDispatcher(TaskPriority.DEFAULT);
  • ParallelTaskDispatcher
    并發任務分發器,由 Ability 執行 createParallelTaskDispatcher() 創建并返回。與 GlobalTaskDispatcher 不同的是,ParallelTaskDispatcher 不具有全局唯一性,可以創建多個。開發者在創建或銷毀 dispatcher 時,需要持有對應的對象引用 。
String dispatcherName = "parallelTaskDispatcher";
TaskDispatcher parallelTaskDispatcher = createParallelTaskDispatcher(dispatcherName, TaskPriority.DEFAULT);
  • SerialTaskDispatcher
    串行任務分發器,由 Ability 執行 createSerialTaskDispatcher()創建并返回。由該分發器分發的所有的任務都是按順序執行,但是執行這些任務的線程并不是固定的。如果要執行并行任務,應使用 ParallelTaskDispatcher 或者 GlobalTaskDispatcher,而不是創建多個 SerialTaskDispatcher。如果任務之間沒有依賴,應使用GlobalTaskDispatcher 來實現。它的創建和銷毀由開發者自己管理,開發者在使用期間需要持有該對象引用。
 String dispatcherName = "serialTaskDispatcher";
TaskDispatcher serialTaskDispatcher = createSerialTaskDispatcher(dispatcherName, TaskPriority.DEFAULT); 
  • SpecTaskDispatcher

專有任務分發器,綁定到專有線程上的任務分發器。目前已有的專有線程是主線程。 UITaskDispatcher 和 MainTaskDispatcher 都屬于 SpecTaskDispatcher。建議使用 UITaskDispatcher。

UITaskDispatcher:綁定到應用主線程的專有任務分發器, 由 Ability 執行 getUITaskDispatcher() 創建并返回。 由該分發器分發的所有的任務都是在主線程上按順序執行,它在應用程序結束時被銷毀。

TaskDispatcher uiTaskDispatcher = getUITaskDispatcher();

MainTaskDispatcher:由 Ability 執行 getMainTaskDispatcher() 創建并返回。

  TaskDispatcher mainTaskDispatcher= getMainTaskDispatcher()

開發步驟

  • syncDispatch

同步派發任務:派發任務并在當前線程等待任務執行完成。在返回前,當前線程會被阻塞。

如下代碼示例展示了如何使用 GlobalTaskDispatcher 派發同步任務:

globalTaskDispatcher.syncDispatch(new Runnable() {
              @Override
              public void run() {
                  HiLog.info(label, "sync task1 run");
              }
          });
  HiLog.info(label, "after sync task1");
   
  globalTaskDispatcher.syncDispatch(new Runnable() {
              @Override
              public void run() {
                  HiLog.info(label, "sync task2 run");
              }
          });
  HiLog.info(label, "after sync task2");
   
  globalTaskDispatcher.syncDispatch(new Runnable() {
              @Override
              public void run() {
                  HiLog.info(label, "sync task3 run");
              }
          });
  HiLog.info(label, "after sync task3");
   
  // 執行結果如下:
  // sync task1 run
  // after sync task1
  // sync task2 run
  // after sync task2
  // sync task3 run
  // after sync task3

說明

如果對 syncDispatch 使用不當, 將會導致死鎖。如下情形可能導致死鎖發生:

  • 在專有線程上,利用該專有任務分發器進行 syncDispatch。
  • 在被某個串行任務分發器(dispatcher_a)派發的任務中,再次利用同一個串行任務分發器(dispatcher_a)對象派發任務。
  • 在被某個串行任務分發器(dispatcher_a)派發的任務中,經過數次派發任務,最終又利用該(dispatcher_a)串行任務分發器派發任務。例如:dispatcher_a 派發的任務使用 dispatcher_b 進行任務的派發,在 dispatcher_b 派發的任務中又利用 dispatcher_a 進行派發任務。
  • 串行任務分發器(dispatcher_a)派發的任務中利用串行任務分發器(dispatcher_b)進行同步派發任務,同時 dispatcher_b 派發的任務中利用串行任務分發器(dispatcher_a)進行同步派發任務。在特定的線程執行順序下將導致死鎖。
  • asyncDispatch
異步派發任務:派發任務,并立即返回,返回值是一個可用于取消任務的接口。

如下代碼示例展示了如何使用 GlobalTaskDispatcher 派發異步任務:

  Revocable revocable =  globalTaskDispatcher.asyncDispatch(new Runnable() {
          @Override
              public void run() {
                  HiLog.info(label, "async task1 run");
              }
          });
  HiLog.info(label, "after async task1");
   
  // 執行結果可能如下:
  // after async task1
  // async task1 run
  • delayDispatch

異步延遲派發任務:異步執行,函數立即返回,內部會在延時指定時間后將任務派發到相應隊列中。延時時間參數僅代表在這段時間以后任務分發器會將任務加入到隊列中,任務的實際執行時間可能晚于這個時間。具體比這個數值晚多久,取決于隊列及內部線程池的繁忙情況。

如下代碼示例展示了如何使用 GlobalTaskDispatcher 延遲派發任務:

 final long callTime = System.currentTimeMillis();
   final long delayTime = 50;
   Revocable revocable =  globalTaskDispatcher.delayDispatch(new Runnable() {
              @Override
              public void run() {
                  HiLog.info(label, "delayDispatch task1 run");
                  final long actualDelayMs = System.currentTimeMillis() - callTime;
                  HiLog.info(label, "actualDelayTime >= delayTime : %{public}b" + (actualDelayMs >= delayTime));
              }
          }, delayTime );
   HiLog.info(label, "after delayDispatch task1");
   
  // 執行結果可能如下:
  // after delayDispatch task1
  // delayDispatch task1 run
  // actualDelayTime >= delayTime : true
  • Group

任務組:表示一組任務,且該組任務之間有一定的聯系,由 TaskDispatcher 執行 createDispatchGroup 創建并返回。將任務加入任務組,返回一個用于取消任務的接口。

如下代碼示例展示了任務組的使用方式:將一系列相關聯的下載任務放入一個任務組,執行完下載任務后關閉應用。

  void groupTest(Context context) {
      TaskDispatcher dispatcher = context.createParallelTaskDispatcher(dispatcherName, TaskPriority.DEFAULT);
      // 創建任務組。
      Group group = dispatcher.createDispatchGroup();
      // 將任務1加入任務組,返回一個用于取消任務的接口。
      dispatcher.asyncGroupDispatch(group, new Runnable(){
          public void run() {
              HiLog.info(label, "download task1 is running");
              downLoadRes(url1);
          }
      });
     // 將與任務1相關聯的任務2加入任務組。
      dispatcher.asyncGroupDispatch(group, new Runnable(){
          public void run() {
              HiLog.info(label, "download task2 is running");
              downLoadRes(url2);
          }
      });
      // 在任務組中的所有任務執行完成后執行指定任務。
      dispatcher.groupDispatchNotify(group, new Runnable(){
          public void run() {
              HiLog.info(label, "the close task is running after all tasks in the group are completed");
              closeApp();
          }
      });
  }
  ?
  // 可能的執行結果:
  // download task1 is running
  // download task2 is running
  // the close task is running after all tasks in the group are completed
   
  // 另外一種可能的執行結果:
  // download task2 is running
  // download task1 is running
  // the close task is running after all tasks in the group are completed
  • Revocable

取消任務:Revocable 是取消一個異步任務的接口。異步任務包括通過 asyncDispatch、delayDispatch、asyncGroupDispatch 派發的任務。如果任務已經在執行中或執行完成,則會返回取消失敗。

如下代碼示例展示了如何取消一個異步延時任務:


  void postTaskAndRevoke(Context context) {
      TaskDispatcher dispatcher = context.getUITaskDispatcher();
      Revocable revocable = dispatcher.delayDispatch(new Runnable(){
           HiLog.info(label, "delay dispatch");
      }, 10);
      boolean revoked = revocable.revoke();
      HiLog.info(label, "%{public}b", revoked);
  }
  ?
  // 一種可能的結果如下 :
  // true
  • syncDispatchBarrier

同步設置屏障任務:在任務組上設立任務執行屏障,同步等待任務組中的所有任務執行完成,再執行指定任務。

說明

在全局并發任務分發器(GlobalTaskDispatcher)上同步設置任務屏障,將不會起到屏障作用。

如下代碼示例展示了如何同步設置屏障:

     TaskDispatcher dispatcher = context.createParallelTaskDispatcher(dispatcherName, TaskPriority.DEFAULT);
      // 創建任務組。
      Group group = dispatcher.createDispatchGroup();
      // 將任務加入任務組,返回一個用于取消任務的接口。
      dispatcher.asyncGroupDispatch(group, new Runnable(){
          public void run() {
              HiLog.info(label, "task1 is running");  // 1
          }
      });
      dispatcher.asyncGroupDispatch(group, new Runnable(){
          public void run() {
              HiLog.info(label, "task2 is running");  // 2
          }
      });
      
      dispatcher.syncDispatchBarrier(new Runnable() {  
      public void run() {  
          HiLog.info(label, "barrier");  // 3
      }});  
      HiLog.info(label, "after syncDispatchBarrier");  // 4
  }
  ?
  // 1和2的執行順序不定;3和4總是在1和2之后按順序執行。
   
  // 可能的執行結果:
  // task1 is running
  // task2 is running
  // barrier
  // after syncDispatchBarrier
   
  // 另外一種執行結果:
  // task2 is running
  // task1 is running
  // barrier
  // after syncDispatchBarrier
  • asyncDispatchBarrier

異步設置屏障任務:在任務組上設立任務執行屏障后直接返回,指定任務將在任務組中的所有任務執行完成后再執行。

說明

在全局并發任務分發器(GlobalTaskDispatcher)上異步設置任務屏障,將不會起到屏障作用。可以使用并發任務分發器(ParallelTaskDispatcher)分離不同的任務組,達到微觀并行、宏觀串行的行為。

如下代碼示例展示了如何異步設置屏障:

 TaskDispatcher dispatcher = context.createParallelTaskDispatcher(dispatcherName, TaskPriority.DEFAULT);
      // 創建任務組。
      Group group = dispatcher.createDispatchGroup();
      // 將任務加入任務組,返回一個用于取消任務的接口。
      dispatcher.asyncGroupDispatch(group, new Runnable(){
          public void run() {
              HiLog.info(label, "task1 is running");  // 1
          }
      });
      dispatcher.asyncGroupDispatch(group, new Runnable(){
          public void run() {
              HiLog.info(label, "task2 is running");  // 2
          }
      });
      
      dispatcher.asyncDispatchBarrier(new Runnable() {  
          public void run() {  
              HiLog.info(label, "barrier");  // 3
          }
  });  
      HiLog.info(label, "after syncDispatchBarrier");  // 4
  }
  ?
  // 1和2的執行順序不定,但總在3和4之前執行;4可能在3之前執行
   
  // 可能的執行結果:
  // task1 is running
  // task2 is running
  // after syncDispatchBarrier
  // barrier 
  • applyDispatch

執行多次任務:對指定任務執行多次。

如下代碼示例展示了如何執行多次任務:


   final int total = 10;
   final CountDownLatch latch = new CountDownLatch(total);
   final ArrayList indexList = new ArrayList(total);
   
   // 執行任務 total 次
   dispatcher.applyDispatch((index) -> {
       indexList.add(index);
       latch.countDown();
   }, total);
   
   // 設置任務超時
   try {    
       latch.await();
   } catch (InterruptedException exception) {
      HiLog.info(label, "latch exception");
   }
   HiLog.info(label, "list size matches, %{public}b", (total == indexList.size()));
   
  // 執行結果:
  // list size matches, true
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 線程
    +關注

    關注

    0

    文章

    505

    瀏覽量

    19725
  • 鴻蒙
    +關注

    關注

    57

    文章

    2392

    瀏覽量

    42972
  • HarmonyOS
    +關注

    關注

    79

    文章

    1982

    瀏覽量

    30419
收藏 人收藏

    評論

    相關推薦

    HarmonyOS CPU與I/O密集型任務開發指導

    一、CPU密集型任務開發指導 CPU密集型任務是指需要占用系統資源處理大量計算能力的任務,需要長時間運行,這段時間會阻塞線程其它事件的處理,不適宜放在主線程進行。例如圖像處理、視頻編碼、數據分析等
    的頭像 發表于 02-18 10:17 ?994次閱讀
    HarmonyOS CPU與I/O密集型任務<b class='flag-5'>開發指導</b>

    鴻蒙OS開發實例:【手擼服務卡片】

    服務卡片指導文檔位于“**開發/應用模型/Stage模型開發指導/Stage模型應用組件**”路徑下,說明其極其重要。本篇文章將分享實現服務卡片的過程和代碼
    的頭像 發表于 03-28 22:11 ?1235次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OS</b><b class='flag-5'>開發</b>實例:【手擼服務卡片】

    USB開發指導資料

    USB開發指導資料[hide][/hide]
    發表于 04-17 00:00

    Silicon、IDE開發指導

    Silicon、IDE開發指導手冊,希望對大家有所幫助。
    發表于 01-09 14:45

    【HarmonyOS】HarmonyOS子系統開發指導

    子系統開發主要從三個方面進行指導,分別是圖形圖像類子系統開發指導,相機子系統開發指導和音視頻子系統開發指導。圖形圖像容器類組件
    發表于 09-21 14:50

    BearPi-HM_Nano開發鴻蒙OS內核編程開發——Thread多線程

    BearPi-HM_Nano開發鴻蒙OS內核編程開發——Thread多線程本示例將演示如何在BearPi-HM_Nano
    發表于 04-09 09:50

    華為系統升級鴻蒙os

    ?其中最受網友們所關注的便是鴻蒙OS手機版Beta3增加可以媲美iOS系統的內存管理,還有華為鴻蒙OS系統獨有的多設備超級終端分布流轉
    發表于 07-28 07:56

    鴻蒙 OS 應用開發初體驗

    的操作系統平臺和開發框架。HarmonyOS 的目標是實現跨設備的無縫協同和高性能。 DevEco Studio 對標 Android Studio,開發鴻蒙 OS 應用的 IDE。
    發表于 11-02 19:38

    基于GoKit的產品開發指導

    基于GoKit的產品開發指導,有板子的可以下載看看的
    發表于 11-16 19:00 ?0次下載

    ZigBee2007視頻教程-應用開發指導

    ZigBee2007視頻教程-應用開發指導ZigBee2007視頻教程-應用開發指導ZigBee2007視頻教程-應用開發指導ZigBee2007視頻教程-應用開發指導
    發表于 12-29 10:31 ?19次下載

    TI DM388評估模塊和開發開發指導手冊

    TI DM388評估模塊和開發開發指導手冊
    發表于 11-25 18:06 ?15次下載

    nRF51 DK板載的開發指導手冊免費下載

    本文檔的主要內容詳細介紹的是nRF51 DK板載的開發指導手冊免費下載。
    發表于 02-14 08:00 ?0次下載
    nRF51 DK板載的<b class='flag-5'>開發指導</b>手冊免費下載

    AN3307_遵循IEC60335_B級規范的STM32應用開發指導

    AN3307_遵循IEC60335_B級規范的STM32應用開發指導
    發表于 11-21 17:07 ?1次下載
    AN3307_遵循IEC60335_B級規范的STM32應用<b class='flag-5'>開發指導</b>

    使用 Taro 開發鴻蒙原生應用 —— 快速上手,鴻蒙應用開發指

    鴻蒙原生應用。 在 《使用 Taro 開發鴻蒙原生應用》 系列文章中,我們已經介紹了 鴻蒙的基本概念 和 Taro 適配鴻蒙的原理。本文作
    的頭像 發表于 02-02 16:09 ?931次閱讀
    使用 Taro <b class='flag-5'>開發</b><b class='flag-5'>鴻蒙</b>原生應用 —— 快速上手,<b class='flag-5'>鴻蒙</b>應用<b class='flag-5'>開發指</b>南

    DP83640寄存器及物理層接口開發指導

    DP83640寄存器及物理層接口開發指導
    發表于 07-08 14:58 ?0次下載
    主站蜘蛛池模板: 动漫美女被到爽了流漫画 | 欧美极品尿交 | 97公开超碰在线视频 | 7723日本高清完整版在线观看 | 四虎视频最新视频在线观看 | 亚洲熟妇无码乱子AV电影 | 久久久久婷婷国产综合青草 | 中文国产成人精品久久免费 | 国产传媒18精品免费1区 | 国产成人午夜精品免费视频 | 晚夜免费禁用十大亏亏 | 欧洲videosdesrxotv | 4399的视频BD高清在线观看免费 | 囯产免费精品一品二区三区视频 | 青青操久久 | 国产喷水1区2区3区咪咪爱AV | 精品国产乱码久久久久久免费 | 97国产精品久久精品国产 | 嘴巴舔着她的私处插 | 日韩内射美女人妻一区二区三区 | 男人插曲视频大全免费网站 | 少女10声大哥喊退色狼 | 无套内射无矿码免费看黄 | 99re热视频这里只有精品 | 伦理79电影网在线观看 | 91精品乱码一区二区三区 | 久久综合久久伊人 | 印度12 13free | proburn中文破解版下载 | 国产精品高潮AV久久无码 | 第一次处破女完整版电影 | 999久久免费高清热精品 | 人妻系列合集 | 原神美女被超污app 御姐被吸奶 | 成人免费在线观看 | 最近免费中文字幕大全免费 | caoporn超碰视频| 禁漫H天堂免费A漫 | 挠黑色超薄丝袜脚心vk40分钟 | 四虎永久免费网址 | 亚州三级视频 |