成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

HarmonyOS Sample 之 TaskDispatcher線程管理

開發 前端 OpenHarmony
不同應用在各自獨立的進程中運行。當應用以任何形式啟動時,系統為其創建進程,該進程將持續運行。當進程完成當前任務處于等待狀態,且系統資源不足時,系統自動回收。

[[424091]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

1.介紹

不同應用在各自獨立的進程中運行。當應用以任何形式啟動時,系統為其創建進程,該進程將持續運行。當進程完成當前任務處于等待狀態,且系統資源不足時,系統自動回收。

在啟動應用時,系統會為該應用創建一個稱為“主線程”的執行線程。該線程隨著應用創建或消失,是應用的核心線程。UI界面的顯示和更新等操作,都是在主線程上進行。主線程又稱UI線程,默認情況下,所有的操作都是在主線程上執行。如果需要執行比較耗時的任務(如下載文件、查詢數據庫),可創建其他線程來處理。

如果應用的業務邏輯比較復雜,可能需要創建多個線程來執行多個任務。這種情況下,代碼復雜難以維護,任務與線程的交互也會更加繁雜。

要解決此問題,開發者可以使用“TaskDispatcher”來分發不同的任務。

比如前段時間 “疫情助手” 的卡片應用,需要獲取位置信息并進行逆地理編碼,安康碼的生成,這些功能就需要單獨創建多個線程來執行任務。

2.搭建環境

安裝DevEco Studio,詳情請參考DevEco Studio下載

設置DevEco Studio開發環境,DevEco Studio開發環境需要依賴于網絡環境,需要連接上網絡才能確保工具的正常使用,可以根據如下兩種情況來配置開發環境:

如果可以直接訪問Internet,只需進行下載HarmonyOS SDK操作。

如果網絡不能直接訪問Internet,需要通過代理服務器才可以訪問,請參考配置開發環境

下載源碼后,使用DevEco Studio 打開項目。

3.理論支持

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

TaskDispatcher具有多種實現,每種實現對應不同的任務分發器。在分發任務時可以指定任務的優先級,由同一個任務分發器分發出的任務具有相同的優先級。

系統提供的任務分發器有GlobalTaskDispatcher、ParallelTaskDispatcher、SerialTaskDispatcher 、SpecTaskDispatcher。

線程優先級有HIGH、DEFAULT、LOW,執行幾率遞減。

分發器提供了常用的操作,

包括:同步派發任務、異步派發任務、異步延遲派發任務、同步設置屏障任務、異步設置屏障任務、執行多次任務、取消任務、任務組等操作。

后面的實例分析中我們會逐個講解幾種任務分發器的概念和用法。

4.實例講解

4.1.UI界面

UI界面很簡單了, 就是為了試驗不同類型的任務分發器而設計的按鈕,如下圖:

HarmonyOS Sample 之 TaskDispatcher線程管理-鴻蒙HarmonyOS技術社區

4.2.后臺代碼

重點在這了,官方代碼結合API提示,增加了注釋說明

4.2.1 GlobalTaskDispatcher 全局并發任務分發器

全局并發任務分發器,由Ability執行getGlobalTaskDispatcher()獲取。

適用于任務之間沒有聯系的情況。一個應用只有一個GlobalTaskDispatcher,它在程序結束時才被銷毀。我們從名字也能看出是get而不是createXXX,具有全局唯一性。

a.同步派發任務

  1. /** 
  2.  * 全局任務分發器 
  3.  * 同步任務,分派一個任務并等待該任務在當前線程中完成。 
  4.  * 
  5.  * @param component 
  6.  */ 
  7. private void syncTask(Component component) { 
  8.     // 
  9.     StringBuffer stringBuffer = new StringBuffer(); 
  10.     //全局并發任務分發器 
  11.     TaskDispatcher globalTaskDispatcher = getGlobalTaskDispatcher(TaskPriority.DEFAULT); 
  12.     HiLog.debug(LABEL_LOG, "task run..."); 
  13.     try { 
  14.         //同步任務1,分派一個任務并等待該任務在當前線程中完成。 
  15.         globalTaskDispatcher.syncDispatch( 
  16.                 () -> { 
  17.                     for (int i = 0; i < 2; i++) { 
  18.                         stringBuffer.append("Sync task1 run").append(System.lineSeparator()); 
  19.                         try { 
  20.                             Thread.sleep(1000); 
  21.                         } catch (InterruptedException e) { 
  22.                             e.printStackTrace(); 
  23.                         } 
  24.                     } 
  25.                     HiLog.debug(LABEL_LOG, "task1 run finished"); 
  26.                 }); 
  27.  
  28.         stringBuffer.append("After sync task1").append(System.lineSeparator()); 
  29.  
  30.         //同步任務2,分派一個任務并等待該任務在當前線程中完成。 
  31.         globalTaskDispatcher.syncDispatch(() -> 
  32.         { 
  33.             for (int i = 0; i < 2; i++) { 
  34.                 stringBuffer.append("Sync task2 run").append(System.lineSeparator()); 
  35.                 try { 
  36.                     Thread.sleep(1000); 
  37.                 } catch (InterruptedException e) { 
  38.                     e.printStackTrace(); 
  39.                 } 
  40.             } 
  41.             HiLog.debug(LABEL_LOG, "task2 run finished"); 
  42.         }); 
  43.  
  44.     } catch (Exception e) { 
  45.         e.printStackTrace(); 
  46.     } 
  47.     stringBuffer.append("After sync task2").append(System.lineSeparator()); 
  48.     HiLog.debug(LABEL_LOG, "task run finished"); 
  49.     resultText.setText(stringBuffer.toString()); 

 輸出結果

  1. 09-08 00:13:04.204 5526-5526/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run... 
  2. 09-08 00:13:06.206 5526-10427/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Sync task1 run finished 
  3. 09-08 00:13:08.208 5526-10610/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Sync task2 run finished 
  4. 09-08 00:13:08.209 5526-5526/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run finished 

 b.異步派發任務

  1. /** 
  2.  * 全局任務分發器 
  3.  * 異步任務,分派任務并立即返回值,無需等待任務執行 
  4.  * 
  5.  * @param component 
  6.  */ 
  7. private void asyncTask(Component component) { 
  8.     StringBuffer stringBuffer = new StringBuffer(); 
  9.     HiLog.debug(LABEL_LOG, "Main task run..."); 
  10.  
  11.     //全局并發任務分發器 
  12.     TaskDispatcher globalTaskDispatcher = getGlobalTaskDispatcher(TaskPriority.DEFAULT); 
  13.  
  14.     //異步任務,分派任務并立即返回值,無需等待任務執行 
  15.     globalTaskDispatcher.asyncDispatch(() -> { 
  16.         try { 
  17.             Thread.sleep(200); 
  18.         } catch (InterruptedException e) { 
  19.             HiLog.error(LABEL_LOG, "%{public}s""AsyncDispatch InterruptedException"); 
  20.         } 
  21.         stringBuffer.append("Async task1 run").append(System.lineSeparator()); 
  22.  
  23.         //將同步 Runnable 任務發送到事件隊列。 該線程被阻塞,直到任務被執行。 
  24.         handler.postSyncTask(() -> resultText.setText(stringBuffer.toString())); 
  25.         HiLog.debug(LABEL_LOG, "Async task1 run finished"); 
  26.     }); 
  27.  
  28.  
  29.     stringBuffer.append("After async task1").append(System.lineSeparator()); 
  30.     HiLog.debug(LABEL_LOG, "Main task run continue"); 
  31.     //異步任務2,分派任務并立即返回值,無需等待任務執行 
  32.     globalTaskDispatcher.asyncDispatch(() -> { 
  33.         try { 
  34.             Thread.sleep(200); 
  35.         } catch (InterruptedException e) { 
  36.             HiLog.error(LABEL_LOG, "%{public}s""AsyncDispatch InterruptedException"); 
  37.         } 
  38.         stringBuffer.append("Async task2 run").append(System.lineSeparator()); 
  39.  
  40.         //將同步 Runnable 任務發送到事件隊列。 該線程被阻塞,直到任務被執行。 
  41.         handler.postSyncTask(() -> resultText.setText(stringBuffer.toString())); 
  42.         HiLog.debug(LABEL_LOG, "Async task2 run finished"); 
  43.     }); 
  44.  
  45.     stringBuffer.append("After async task2").append(System.lineSeparator()); 
  46.     HiLog.debug(LABEL_LOG, "Main task run finished"); 
  47.     resultText.setText(stringBuffer.toString()); 

 輸出結果

  1. 09-08 00:18:27.779 9609-9609/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run... 
  2. 09-08 00:18:27.780 9609-9609/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run continue 
  3. 09-08 00:18:27.781 9609-9609/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run finished 
  4. 09-08 00:18:28.115 9609-613/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async task1 run finished 
  5. 09-08 00:18:28.115 9609-614/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async task2 run finished 
  6. 或 
  7. 09-08 00:18:58.635 9609-9609/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run... 
  8. 09-08 00:18:58.635 9609-9609/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run continue 
  9. 09-08 00:18:58.636 9609-9609/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run finished 
  10. 09-08 00:18:58.840 9609-3584/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async task2 run finished 
  11. 09-08 00:18:58.840 9609-3583/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async task1 run finished 

 c.異步延遲派發任務

  1. /** 
  2.  * 延遲任務 
  3.  * 在給定的延遲后分派任務。 
  4.  * 這是一個異步執行并立即返回一個值而無需等待。 
  5.  * 
  6.  * @param component 
  7.  */ 
  8. private void delayTask(Component component) { 
  9.     StringBuffer stringBuffer = new StringBuffer(); 
  10.  
  11.     //全局并發任務分發器 
  12.     TaskDispatcher globalTaskDispatcher = getGlobalTaskDispatcher(TaskPriority.DEFAULT); 
  13.     //調用時間 
  14.     final long callTime = System.currentTimeMillis(); 
  15.     HiLog.debug(LABEL_LOG, "Main task run... current1 time:" + callTime); 
  16.     //延遲任務1,在給定的延遲后分派任務,這是一個異步執行并立即返回一個值而無需等待 
  17.     globalTaskDispatcher.delayDispatch(() -> { 
  18.         stringBuffer.append("DelayDispatch task1 run").append(System.lineSeparator()); 
  19.  
  20.         final long actualDelayMs = System.currentTimeMillis() - callTime; 
  21.  
  22.         stringBuffer.append("ActualDelayTime >= delayTime : ").append((actualDelayMs >= DELAY_TIME)); 
  23.  
  24.         //將同步 Runnable 任務發送到事件隊列。 該線程被阻塞,直到任務被執行。 
  25.         handler.postSyncTask(() -> resultText.setText(stringBuffer.toString())); 
  26.         HiLog.debug(LABEL_LOG, "Async task1 run finished duration:" + actualDelayMs); 
  27.     }, DELAY_TIME); 
  28.  
  29.  
  30.     stringBuffer.append("After delayDispatch task1").append(System.lineSeparator()); 
  31.     final long callTime2 = System.currentTimeMillis(); 
  32.     HiLog.debug(LABEL_LOG, "Main task run finished current2 time:" + callTime2); 
  33.     resultText.setText(stringBuffer.toString()); 

輸出結果

  1. 09-08 00:20:50.912 9609-9609/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run... current1 time:1631031650912 
  2. 09-08 00:20:50.913 9609-9609/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run finished current2 time:1631031650913 
  3. 09-08 00:20:51.916 9609-11689/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async task1 run finished duration:1002 

 d.執行多次任務

執行多次任務:對指定任務執行多次。多次執行的順序也不是固定的。

  1. /** 
  2.  * 執行多次任務 
  3.  * 對指定任務執行多次 
  4.  * 
  5.  * @param component 
  6.  */ 
  7. private void applyDispatchTask(Component component) { 
  8.     StringBuilder stringBuilder = new StringBuilder(); 
  9.  
  10.     //倒計時鎖存器 
  11.     final CountDownLatch latch = new CountDownLatch(TASK_TOTAL); 
  12.     final ArrayList<Long> indexList = new ArrayList<>(TASK_TOTAL); 
  13.  
  14.     TaskDispatcher globalTaskDispatcher = getGlobalTaskDispatcher(TaskPriority.DEFAULT); 
  15.     HiLog.debug(LABEL_LOG, "Main task run..."); 
  16.     //執行任務 TASK_TOTAL 次 
  17.     globalTaskDispatcher.applyDispatch(index -> { 
  18.         // 
  19.         indexList.add(index); 
  20.         HiLog.debug(LABEL_LOG, "Async task" + index+" run finished"); 
  21.         //遞減鎖存器的計數,如果計數達到零,則釋放所有等待的線程。 
  22.         latch.countDown(); 
  23.     }, TASK_TOTAL); 
  24.  
  25.     try { 
  26.         // 設置任務超時。 
  27.         latch.await(); 
  28.     } catch (InterruptedException exception) { 
  29.         HiLog.error(LABEL_LOG, "%{public}s""applyDispatchTask InterruptedException"); 
  30.     } 
  31.     stringBuilder.append("List size matches :").append((indexList.size() == TASK_TOTAL)); 
  32.     HiLog.debug(LABEL_LOG, "Main task run finished"); 
  33.     resultText.setText(stringBuilder.toString()); 

 輸出結果

  1. 09-08 00:45:23.796 7836-7836/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run... 
  2. 09-08 00:45:23.797 7836-18216/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async task0 run finished 
  3. 09-08 00:45:23.799 7836-18219/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async task3 run finished 
  4. 09-08 00:45:23.800 7836-18220/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async task4 run finished 
  5. 09-08 00:45:23.800 7836-18217/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async task1 run finished 
  6. 09-08 00:45:23.801 7836-18218/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async task2 run finished 
  7. 09-08 00:45:23.801 7836-18221/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async task5 run finished 
  8. 09-08 00:45:23.801 7836-18222/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async task6 run finished 
  9. 09-08 00:45:23.802 7836-18223/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async task7 run finished 
  10. 09-08 00:45:23.802 7836-18224/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async task8 run finished 
  11. 09-08 00:45:23.802 7836-18225/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async task9 run finished 
  12. 09-08 00:45:23.803 7836-7836/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run finished 

4.2.2 ParallelTaskDispatcher 并發任務分發器

并發任務分發器,由Ability執行createParallelTaskDispatcher()創建并返回。

與GlobalTaskDispatcher不同的是,ParallelTaskDispatcher不具有全局唯一性,可以創建多個。開發者在創建或銷毀dispatcher時,需要持有對應的對象引用。

a.同步設置屏障任務

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

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

  1. /** 
  2.  * 同步設置屏障任務 
  3.  * 在任務組上設立任務執行屏障,同步等待任務組中的所有任務執行完成,再執行指定任務 
  4.  * 在全局并發任務分發器(GlobalTaskDispatcher)上同步設置任務屏障,將不會起到屏障作用。 
  5.  * 
  6.  * @param component 
  7.  */ 
  8. private void syncBarrier(Component component) { 
  9.     StringBuffer stringBuffer = new StringBuffer(); 
  10.     //并發任務分發器,不具有全局唯一性,可以創建多個 
  11.     TaskDispatcher dispatcher = createParallelTaskDispatcher("SyncBarrierDispatcher", TaskPriority.DEFAULT); 
  12.     HiLog.debug(LABEL_LOG, "Main task run..."); 
  13.     //創建任務組 
  14.     Group group = dispatcher.createDispatchGroup(); 
  15.  
  16.     //添加異步任務到組中 
  17.     dispatcher.asyncGroupDispatch(group, () -> 
  18.             { 
  19.                 stringBuffer.append("Task1 is running").append(System.lineSeparator()); 
  20.                 HiLog.debug(LABEL_LOG, "Async task1 run finished"); 
  21.             }); 
  22.     dispatcher.asyncGroupDispatch(group, () -> 
  23.     { 
  24.         stringBuffer.append("Task2 is running").append(System.lineSeparator()); 
  25.         HiLog.debug(LABEL_LOG, "Async task2 run finished"); 
  26.     }); 
  27.  
  28.     //同步設置屏障任務,所有任務執行完成,再執行指定任務 
  29.     dispatcher.syncDispatchBarrier(() -> 
  30.     { 
  31.         stringBuffer.append("Barrier").append(System.lineSeparator()); 
  32.         HiLog.debug(LABEL_LOG, "Sync barrier task run finished"); 
  33.     }); 
  34.  
  35.     stringBuffer.append("After syncDispatchBarrier").append(System.lineSeparator()); 
  36.     HiLog.debug(LABEL_LOG, "Main task run finished"); 
  37.     resultText.setText(stringBuffer.toString()); 

 輸出結果

  1. 09-08 00:28:49.975 31645-31645/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run... 
  2. 09-08 00:28:49.980 31645-13304/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async task1 run finished 
  3. 09-08 00:28:49.981 31645-13305/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async task2 run finished 
  4. 09-08 00:28:49.982 31645-13306/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Sync barrier task run finished 
  5. 09-08 00:28:49.983 31645-31645/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run finished 
  6. 或 
  7. 09-08 00:32:24.630 31645-31645/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run... 
  8. 09-08 00:32:24.633 31645-27346/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async task2 run finished 
  9. 09-08 00:32:24.634 31645-27345/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async task1 run finished 
  10. 09-08 00:32:24.636 31645-27347/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Sync barrier task run finished 
  11. 09-08 00:32:24.636 31645-31645/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run finished 

 b.異步設置屏障任務

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

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

可以使用并發任務分發器(ParallelTaskDispatcher)分離不同的任務組,達到微觀并行、宏觀串行的行為。

  1. /** 
  2.  * 異步設置屏障任務 
  3.  * 在任務組上設立任務執行屏障后直接返回,指定任務將在任務組中的所有任務執行完成后再執行。 
  4.  * 
  5.  * @param component 
  6.  */ 
  7. private void asyncBarrier(Component component) { 
  8.     StringBuffer stringBuffer = new StringBuffer(); 
  9.     //異步任務分發器,不具有全局唯一性,可以創建多個 
  10.     TaskDispatcher dispatcher = createParallelTaskDispatcher("AsyncBarrierDispatcher", TaskPriority.DEFAULT); 
  11.     HiLog.debug(LABEL_LOG, "Main task run..."); 
  12.     //創建任務組 
  13.     Group group = dispatcher.createDispatchGroup(); 
  14.     //添加異步任務到組中 
  15.     dispatcher.asyncGroupDispatch(group, () -> { 
  16.         stringBuffer.append("Task1 is running").append(System.lineSeparator()); 
  17.  
  18.         handler.postSyncTask(() -> resultText.setText(stringBuffer.toString())); 
  19.         HiLog.debug(LABEL_LOG, "Async Task1 is run finished"); 
  20.     }); 
  21.     //添加異步任務到組中 
  22.     dispatcher.asyncGroupDispatch(group, () -> { 
  23.         stringBuffer.append("Task2 is running").append(System.lineSeparator()); 
  24.         handler.postSyncTask(() -> resultText.setText(stringBuffer.toString())); 
  25.         HiLog.debug(LABEL_LOG, "Async Task2 is run finished"); 
  26.     }); 
  27.     //異步設置屏障任務 
  28.     dispatcher.asyncDispatchBarrier(() -> { 
  29.         stringBuffer.append("Barrier").append(System.lineSeparator()); 
  30.         // 
  31.         handler.postSyncTask(() -> resultText.setText(stringBuffer.toString())); 
  32.         HiLog.debug(LABEL_LOG, "Async barrier task run finished"); 
  33.  
  34.     }); 
  35.     stringBuffer.append("After asyncDispatchBarrier").append(System.lineSeparator()); 
  36.     HiLog.debug(LABEL_LOG, "Main task run finished"); 
  37.  
  38.     resultText.setText(stringBuffer.toString()); 

輸出結果

  1. 09-08 00:35:16.089 11855-11855/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run... 
  2. 09-08 00:35:16.092 11855-11855/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run finished 
  3. 09-08 00:35:16.094 11855-8290/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async Task1 is run finished 
  4. 09-08 00:35:16.094 11855-8291/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async Task2 is run finished 
  5. 09-08 00:35:16.103 11855-8292/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async barrier task run finished 
  6. 或 
  7. 09-08 00:36:02.736 11855-11855/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run... 
  8. 09-08 00:36:02.739 11855-11855/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run finished 
  9. 09-08 00:36:02.742 11855-11611/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async Task2 is run finished 
  10. 09-08 00:36:02.743 11855-11610/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async Task1 is run finished 
  11. 09-08 00:36:02.744 11855-11613/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async barrier task run finished 

c.任務組

任務組:表示一組任務,且該組任務之間有一定的聯系,由TaskDispatcher執行createDispatchGroup創建并返回。

將任務加入任務組,返回一個用于取消任務的接口。

  1. /** 
  2.  * 任務組 
  3.  * 將一系列相關聯的任務放入一個任務組,執行完組內全部任務后執行指定任務 
  4.  * 
  5.  * @param component 
  6.  */ 
  7. private void groupTask(Component component) { 
  8.     StringBuffer stringBuffer = new StringBuffer(); 
  9.  
  10.     //并發任務分發器,不具有全局唯一性,可以創建多個 
  11.     TaskDispatcher dispatcher = createParallelTaskDispatcher("MyParallelTaskDispatcher", TaskPriority.DEFAULT); 
  12.     HiLog.debug(LABEL_LOG, "Main task run..."); 
  13.     //創建一個分發組 
  14.     Group group = dispatcher.createDispatchGroup(); 
  15.  
  16.     //異步,將任務1加入任務組,返回一個用于取消任務的接口 
  17.     dispatcher.asyncGroupDispatch(group, () -> { 
  18.         stringBuffer.append("GroupTask1 is running").append(System.lineSeparator()); 
  19.         // 
  20.         handler.postSyncTask(() -> resultText.setText(stringBuffer.toString())); 
  21.  
  22.         HiLog.debug(LABEL_LOG, "Group async task1 finished"); 
  23.     }); 
  24.  
  25.     //異步,將與任務1相關聯的任務2加入任務組。 GroupTask1并不一定比GroupTask2先執行完 
  26.     dispatcher.asyncGroupDispatch(group, () -> { 
  27.         stringBuffer.append("GroupTask2 is running").append(System.lineSeparator()); 
  28.         // 
  29.         handler.postSyncTask(() -> resultText.setText(stringBuffer.toString())); 
  30.         HiLog.debug(LABEL_LOG, "Group async task2 run finished"); 
  31.     }); 
  32.  
  33.     //在任務組中的所有任務執行完成后執行指定任務 
  34.     dispatcher.groupDispatchNotify(group, () -> { 
  35.         stringBuffer.append("This task running after all tasks in the group are completed"
  36.                 .append(System.lineSeparator()); 
  37.         HiLog.debug(LABEL_LOG, "This task running after all tasks in the group are completed"); 
  38.     }); 
  39.  
  40.     //最先執行 
  41.     HiLog.debug(LABEL_LOG, "Main task run finished"); 
  42.     resultText.setText(stringBuffer.toString()); 

輸出結果

  1. 09-08 00:56:43.891 15624-15624/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run... 
  2. 09-08 00:56:43.893 15624-15624/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run finished 
  3. 09-08 00:56:43.895 15624-32143/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Group async task1 finished 
  4. 09-08 00:56:43.895 15624-32144/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Group async task2 run finished 
  5. 09-08 00:56:43.896 15624-32147/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  This task running after all tasks in the group are completed 

 從日志輸出看,說明groupDispatchNotify也是一個異步任務。

4.2.3 SerialTaskDispatcher 串行任務分發器

串行任務分發器,由Ability執行createSerialTaskDispatcher()創建并返回。由該分發器分發的所有的任務都是按順序執行,但是執行這些任務的線程并不是固定的。

如果要執行并行任務,應使用ParallelTaskDispatcher或者GlobalTaskDispatcher,而不是創建多個SerialTaskDispatcher。

如果任務之間沒有依賴,應使用GlobalTaskDispatcher來實現。它的創建和銷毀由開發者自己管理,開發者在使用期間需要持有該對象引用。

  1. /** 
  2.  * 串行任務分發器 
  3.  * 由該分發器分發的所有的任務都是按順序執行,但是執行這些任務的線程并不是固定的。 
  4.  * 如果要執行并行任務,應使用ParallelTaskDispatcher或者GlobalTaskDispatcher,而不是創建多個SerialTaskDispatcher。 
  5.  * 如果任務之間沒有依賴,應使用GlobalTaskDispatcher來實現。它的創建和銷毀由開發者自己管理,開發者在使用期間需要持有該對象引用。 
  6.  * @param component 
  7.  */ 
  8. private void serialTaskDispatcherTask(Component component) { 
  9.     StringBuffer stringBuffer = new StringBuffer(); 
  10.     TaskDispatcher serialTaskDispatcher =createSerialTaskDispatcher("MySerialTaskDispatcher",TaskPriority.DEFAULT); 
  11.     HiLog.debug(LABEL_LOG, "Main task run..."); 
  12.  
  13.    /* //同步任務1,分派一個任務并等待該任務在當前線程中完成。 
  14.     serialTaskDispatcher.asyncDispatch( 
  15.             () -> { 
  16.                 try { 
  17.                     Thread.sleep(3); 
  18.                 } catch (InterruptedException e) { 
  19.                     e.printStackTrace(); 
  20.                 } 
  21.                 stringBuffer.append("Async task1 run").append(System.lineSeparator()); 
  22.                 HiLog.debug(LABEL_LOG, "Async task1 run finished"); 
  23.             }); 
  24.  
  25.     stringBuffer.append("After sync task1").append(System.lineSeparator()); 
  26.  
  27.     //同步任務2,分派一個任務并等待該任務在當前線程中完成。 
  28.     serialTaskDispatcher.asyncDispatch(() -> 
  29.     { 
  30.         try { 
  31.             Thread.sleep(3); 
  32.         } catch (InterruptedException e) { 
  33.             e.printStackTrace(); 
  34.         } 
  35.         stringBuffer.append("Async task2 run").append(System.lineSeparator()); 
  36.         HiLog.debug(LABEL_LOG, "Async task2 run finished"); 
  37.     });*/ 
  38.  
  39.  
  40.     //異步任務1,分派一個任務并等待該任務在當前線程中完成。 
  41.     serialTaskDispatcher.asyncDispatch( 
  42.             () -> { 
  43.                 try { 
  44.                     Thread.sleep(3); 
  45.                 } catch (InterruptedException e) { 
  46.                     e.printStackTrace(); 
  47.                 } 
  48.                 stringBuffer.append("Async task1 run").append(System.lineSeparator()); 
  49.                 handler.postSyncTask(() -> resultText.setText(stringBuffer.toString())); 
  50.                 HiLog.debug(LABEL_LOG, "Async task1 run finished"); 
  51.             }); 
  52.  
  53.     stringBuffer.append("After sync task1").append(System.lineSeparator()); 
  54.  
  55.     //異步任務2,分派一個任務并等待該任務在當前線程中完成。 
  56.     serialTaskDispatcher.asyncDispatch(() -> 
  57.     { 
  58.         try { 
  59.             Thread.sleep(3); 
  60.         } catch (InterruptedException e) { 
  61.             e.printStackTrace(); 
  62.         } 
  63.         stringBuffer.append("Async task2 run").append(System.lineSeparator()); 
  64.         handler.postSyncTask(() -> resultText.setText(stringBuffer.toString())); 
  65.         HiLog.debug(LABEL_LOG, "Async task2 run finished"); 
  66.     }); 
  67.     //異步任務3,分派一個任務并等待該任務在當前線程中完成。 
  68.     serialTaskDispatcher.asyncDispatch(() -> 
  69.     { 
  70.         try { 
  71.             Thread.sleep(3); 
  72.         } catch (InterruptedException e) { 
  73.             e.printStackTrace(); 
  74.         } 
  75.         stringBuffer.append("Async task3 run").append(System.lineSeparator()); 
  76.         handler.postSyncTask(() -> resultText.setText(stringBuffer.toString())); 
  77.         HiLog.debug(LABEL_LOG, "Async task3 run finished"); 
  78.     }); 
  79.  
  80.     HiLog.debug(LABEL_LOG, "Main task run finished"); 
  81.     resultText.setText(stringBuffer.toString()); 

輸出結果

同步派發任務

  1. 09-08 01:32:17.493 7945-7945/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run... 
  2. 09-08 01:32:19.494 7945-2486/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Sync task1 run finished 
  3. 09-08 01:32:21.496 7945-2725/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Sync task2 run finished 
  4. 09-08 01:32:21.497 7945-7945/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run finished 
  5.  
  6. 異步派發任務、 
  7. -08 01:37:07.276 8419-8419/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run... 
  8. 09-08 01:37:07.277 8419-8419/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run finished 
  9. 09-08 01:37:07.277 8419-24172/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async task1 run finished 
  10. 09-08 01:37:07.288 8419-24173/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async task2 run finished 
  11. 09-08 01:37:07.290 8419-24178/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Async task3 run finished 

從輸出看出所有的任務都是按順序執行的。

4.2.4 SpecTaskDispatcher 專有任務分發器

專有任務分發器,綁定到專有線程上的任務分發器。目前已有的專有線程為UI線程,通過UITaskDispatcher進行任務分發。

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

a.取消任務

取消任務:Revocable是取消一個異步任務的接口。

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

  1. /** 
  2.  * 提交任務與取消 
  3.  * 取消一個異步任務的接口。 
  4.  * 異步任務包括通過 asyncDispatch、delayDispatch、asyncGroupDispatch 派發的任務。 
  5.  * 如果任務已經在執行中或執行完成,則會返回取消失敗。 
  6.  * 
  7.  * @param component 
  8.  */ 
  9. private void postTaskAndRevoke(Component component) { 
  10.     StringBuffer stringBuffer = new StringBuffer(); 
  11.  
  12.     //專有任務分發器,綁定到應用主線程的專有任務分發器 
  13.     TaskDispatcher dispatcher = getUITaskDispatcher(); 
  14.     HiLog.debug(LABEL_LOG, "Main task run..."); 
  15.     //延遲分發器 
  16.     Revocable revocable = dispatcher.delayDispatch(() -> { 
  17.         stringBuffer.append("Delay dispatch").append(System.lineSeparator()); 
  18.         // 
  19.         handler.postSyncTask(() -> resultText.setText(stringBuffer.toString())); 
  20.         HiLog.debug(LABEL_LOG, "Delay task run finished"); 
  21.     }, 5); 
  22.  
  23.     //取消異步任務 
  24.     boolean revoked = revocable.revoke(); 
  25.     stringBuffer.append("Revoke result :").append(revoked); 
  26.     HiLog.debug(LABEL_LOG, "Main task::delay task revocable finished"); 
  27.     resultText.setText(stringBuffer.toString()); 

輸出結果

  1. 09-08 01:00:27.184 13669-13669/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task run... 
  2. 09-08 01:00:27.184 13669-13669/ohos.samples.taskmanager D 00F00/=>MainAbilitySlice:  Main task::delay task revocable finished 

取消成功,所以Delay task run finished 日志并沒有打印。

5.完整代碼

附件直接下載

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-09-17 14:43:54

鴻蒙HarmonyOS應用

2021-09-24 09:25:01

鴻蒙HarmonyOS應用

2021-08-17 10:20:14

鴻蒙HarmonyOS應用

2021-09-09 14:49:26

鴻蒙HarmonyOS應用

2021-11-23 09:58:35

鴻蒙HarmonyOS應用

2021-11-02 10:10:49

鴻蒙HarmonyOS應用

2021-07-08 09:42:04

鴻蒙HarmonyOS應用

2021-09-22 09:42:41

鴻蒙HarmonyOS應用

2021-07-29 14:03:35

鴻蒙HarmonyOS應用

2021-12-10 15:06:56

鴻蒙HarmonyOS應用

2021-11-30 14:51:11

鴻蒙HarmonyOS應用

2021-12-02 10:11:44

鴻蒙HarmonyOS應用

2023-03-05 16:12:41

Linux進程線程

2021-08-24 15:13:06

鴻蒙HarmonyOS應用

2010-10-20 17:26:26

SQLServer線程

2009-09-27 13:00:56

Hibernate S

2009-09-25 14:28:40

Hibernate S

2023-06-07 13:49:00

多線程編程C#

2009-03-12 10:52:43

Java線程多線程

2011-01-11 13:47:27

Linux管理進程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品久久久久久久久久久久久 | 日韩av大片免费看 | 狠狠操天天操 | 国产美女一区二区 | 日本久久精品视频 | 美女一级a毛片免费观看97 | 一区二区三区精品视频 | 99色播 | 成人在线观看欧美 | 精品亚洲一区二区 | 视频精品一区 | 国产精品人人做人人爽 | 欧美精品一区久久 | 国产精品色婷婷久久58 | 日本一卡精品视频免费 | 日韩国产中文字幕 | 99精品国产一区二区三区 | 亚洲经典一区 | 精彩视频一区二区三区 | 国产精品福利网站 | 中文字幕电影在线观看 | 亚洲国产精品第一区二区 | 午夜一区二区三区 | 日韩a| 色综合久久伊人 | av色站 | 一区二区精品 | 久久久女 | 美女久久 | 亚洲在线一区二区 | 欧美一级二级视频 | 国产精品女人久久久 | 久久久婷婷 | 黄色在线免费播放 | 国产91视频免费 | 日韩高清中文字幕 | 亚洲成人网在线播放 | 亚洲精品一区二区久 | 99免费| 国产精品免费观看 | 国产高清免费视频 |