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

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

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

3天內不再提示

鴻蒙系統中線程管理的使用

OpenHarmony技術社區 ? 來源:鴻蒙技術社區 ? 作者:開鴻HOS小鴻 ? 2021-09-28 09:49 ? 次閱讀

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

在啟動應用時,系統會為該應用創建一個稱為“主線程”的執行線程。該線程隨著應用創建或消失,是應用的核心線程。UI 界面的顯示和更新等操作,都是在主線程上進行。

主線程又稱 UI 線程,默認情況下,所有的操作都是在主線程上執行。如果需要執行比較耗時的任務(如下載文件、查詢數據庫),可創建其他線程來處理。

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

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

TaskDispatcher 介紹

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

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

線程優先級介紹:

HIGH:最高任務優先級,比默認優先級、低優先級的任務有更高的幾率得到執行。

DEFAULT:默認任務優先級, 比低優先級的任務有更高的幾率得到執行。

LOW:低任務優先級,比高優先級、默認優先級的任務有更低的幾率得到執行。

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

系統提供的任務分發器有:

GlobalTaskDispatcher

ParallelTaskDispatcher

SerialTaskDispatcher

SpecTaskDispatcher

實踐

①同步派發任務 syncDispatch

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

/**

* 同步派發任務

*/

private void syncDispatch() {

TaskDispatcher globalTaskDispatcher = getGlobalTaskDispatcher(TaskPriority.DEFAULT);

globalTaskDispatcher.syncDispatch(new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “sync task1 run”);

}

});

HiLog.info(LABEL_LOG, “after sync task1”);

globalTaskDispatcher.syncDispatch(new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “sync task2 run”);

}

});

HiLog.info(LABEL_LOG, “after sync task2”);

globalTaskDispatcher.syncDispatch(new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “sync task3 run”);

}

});

HiLog.info(LABEL_LOG, “after sync task3”);

}

運行之后查看日志:

ff7b8964-1fc0-11ec-82a8-dac502259ad0.png

從運行結果我們可以看到,只有在當前線程等待任務執行完成之后才會繼續往下執行,否則當前線程會被阻塞。

所以在使用 syncDispatch 的時候我們需要注意,如果對 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

派發任務,并立即返回,返回值是一個可用于取消任務的接口。

/**

* 異步派發任務

*/

private void asyncDispatch() {

TaskDispatcher globalTaskDispatcher = getGlobalTaskDispatcher(TaskPriority.DEFAULT);

Revocable revocable = globalTaskDispatcher.asyncDispatch(new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “async task1 run”);

}

});

HiLog.info(LABEL_LOG, “after async task1”);

}

運行之后查看日志:

0001850a-1fc1-11ec-82a8-dac502259ad0.png

從運行結果我們可以看到,只有在當前線程等待任務執行完成之后才會繼續往下執行,否則當前線程會被阻塞,所以在使用。

③異步延遲派發任務 delayDispatch

異步執行,函數立即返回,內部會在延時指定時間后將任務派發到相應隊列中。

延時時間參數僅代表在這段時間以后任務分發器會將任務加入到隊列中,任務的實際執行時間可能晚于這個時間。

具體比這個數值晚多久,取決于隊列及內部線程池的繁忙情況。

/**

* 異步延遲派發任務

*/

private void delayDispatch() {

final long callTime = System.currentTimeMillis();

final long delayTime = 50L;

TaskDispatcher globalTaskDispatcher = getGlobalTaskDispatcher(TaskPriority.DEFAULT);

Revocable revocable = globalTaskDispatcher.delayDispatch(new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “delayDispatch task1 run”);

final long actualDelay = System.currentTimeMillis() - callTime;

HiLog.info(LABEL_LOG, “actualDelayTime 》= delayTime: %{public}b”, (actualDelay 》= delayTime));

}

}, delayTime);

HiLog.info(LABEL_LOG, “after delayDispatch task1”);

}

運行之后查看日志:

00860d66-1fc1-11ec-82a8-dac502259ad0.png

從運行結果我們可以看出:

程序首先執行“after delayDispatch task1”

然后執行“delayDispatch task1 run”

最后執行“actualDelayTime 》= delayTime: %{public}b”, (actualDelay 》= delayTime)

這里 actualDelayTime 》= delayTime: true 可以看出延時時間參數僅代表在這段時間以后任務分發器會將任務加入到隊列中,任務的實際執行時間可能晚于這個時間。

④任務組 Group

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

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

/**

* 任務組

*/

private void dispatchGroup() {

String dispatcherName = “parallelTaskDispatcher”;

TaskDispatcher dispatcher = createParallelTaskDispatcher(dispatcherName, TaskPriority.DEFAULT);

// 創建任務組。

Group group = dispatcher.createDispatchGroup();

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

dispatcher.asyncGroupDispatch(group, new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “download task1 is running”);

}

});

// 將與任務1相關聯的任務2加入任務組。

dispatcher.asyncGroupDispatch(group, new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “download task2 is running”);

}

});

// 在任務組中的所有任務執行完成后執行指定任務。

dispatcher.groupDispatchNotify(group, new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “the close task is running after all tasks in the group are completed”);

}

});

}

運行之后查看日志:

00fbdb4a-1fc1-11ec-82a8-dac502259ad0.png

⑤同步設置屏障任務 syncDispatchBarrier

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

/**

* 同步設置屏障任務

*/

private void syncDispatchBarrier() {

String dispatcherName = “parallelTaskDispatcher”;

TaskDispatcher dispatcher = createParallelTaskDispatcher(dispatcherName, TaskPriority.DEFAULT);

// 創建任務組。

Group group = dispatcher.createDispatchGroup();

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

dispatcher.asyncGroupDispatch(group, new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “task1 is running”); // 1

}

});

dispatcher.asyncGroupDispatch(group, new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “task2 is running”); // 2

}

});

dispatcher.syncDispatchBarrier(new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “barrier”); // 3

}

});

HiLog.info(LABEL_LOG, “after syncDispatchBarrier”); // 4

}

運行之后查看日志:

01a4c066-1fc1-11ec-82a8-dac502259ad0.png

⑥異步設置屏障任務 asyncDispatchBarrier

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

/**

* 異步設置屏障任務

*/

private void asyncDispatchBarrier() {

TaskDispatcher dispatcher = createParallelTaskDispatcher(“dispatcherName”, TaskPriority.DEFAULT);

// 創建任務組。

Group group = dispatcher.createDispatchGroup();

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

dispatcher.asyncGroupDispatch(group, new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “task1 is running”); // 1

}

});

dispatcher.asyncGroupDispatch(group, new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “task2 is running”); // 2

}

});

dispatcher.asyncDispatchBarrier(new Runnable() {

@Override

public void run() {

HiLog.info(LABEL_LOG, “barrier”); // 3

}

});

HiLog.info(LABEL_LOG, “after asyncDispatchBarrier”); // 4

}

運行之后查看日志:

02118cbe-1fc1-11ec-82a8-dac502259ad0.png

總結

線程它就像一面雙刃劍,用的好的時候可以給我們帶來事半功倍等效果,用的不好時就會給我們帶來困擾。

并且這個困擾還不是一時半會能解決掉的(因為發現問題的時候,往往是到了需要優化期了,各項業務相互牽扯),故在項目初期就需要嚴格考慮考量這些問題了。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 線程
    +關注

    關注

    0

    文章

    505

    瀏覽量

    19709
  • 鴻蒙系統
    +關注

    關注

    183

    文章

    2636

    瀏覽量

    66459

原文標題:鴻蒙的線程管理,看完渾身通透!

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    鴻蒙系統在服裝RFID管理中的應用:打造智能零售新時代

    鴻蒙系統結合RFID技術,助力服裝行業智能化升級,實現高效庫存管理、自動化存取、全流程供應鏈管理,以及生產計件管理。常達智能物聯提供高性能R
    的頭像 發表于 07-15 14:57 ?276次閱讀

    鴻蒙開發:線程模型

    FA模型下的線程主要有如下三類
    的頭像 發表于 06-24 17:27 ?442次閱讀
    <b class='flag-5'>鴻蒙</b>開發:<b class='flag-5'>線程</b>模型

    鴻蒙開發:【線程模型】

    管理其他線程的ArkTS引擎實例,例如使用TaskPool(任務池)創建任務或取消任務、啟動和終止Worker線程
    的頭像 發表于 06-13 16:38 ?428次閱讀
    <b class='flag-5'>鴻蒙</b>開發:【<b class='flag-5'>線程</b>模型】

    千萬不要忽略PCB設計中線寬線距的重要性

    中線寬線距的重要性: 1. 電氣性能: 線寬和線距會影響電路板的電氣性能。線寬決定了導線的電阻,線距則影響信號的串擾。正確選擇線寬和線距可以確保電路板的信號完整性和穩定性。 2. 功率傳輸和熱管理: 線寬的選擇對于功率傳輸和熱管理
    的頭像 發表于 05-29 09:31 ?960次閱讀
    千萬不要忽略PCB設計<b class='flag-5'>中線</b>寬線距的重要性

    鴻蒙系統三防平板怎么樣

    鴻蒙系統三防平板是一款功能強大、性能卓越的平板電腦,其獨特的三防設計使其成為各種惡劣環境下的理想選擇。無論是戶外探險、工地作業還是軍事應用,鴻蒙系統三防平板都能為用戶提供穩定、可靠的性
    發表于 04-12 14:26

    STM32F7使用FreeRTOS,程序運行一段時間后進入HardFault_Handler的原因?

    )”,“精準的數據訪問沖突(PRECISERR)”。 其中工程中線程共6個。線程A每秒打印時間;線程B負責串口1發送命令;線程C負責接收串口1數據,并通過隊列給
    發表于 04-08 07:23

    鴻蒙原生應用開發-ArkTS語言基礎類庫多線程TaskPool和Worker的對比(一)

    TaskPool偏向獨立任務維度,該任務在線程中執行,無需關注線程的生命周期,超長任務(大于3分鐘)會被系統自動回收;而Worker偏向線程的維度,支持長時間占據
    發表于 03-25 14:11

    什么是動態線程池?動態線程池的簡單實現思路

    因此,動態可監控線程池一種針對以上痛點開發的線程管理工具。主要可實現功能有:提供對 Spring 應用內線程池實例的全局管控、應用運行時動態變更
    的頭像 發表于 02-28 10:42 ?659次閱讀

    純血鴻蒙系統,拿什么與安卓、iOS比?

    ArkUI …… 2、鴻蒙進階 Stage模型 網絡、數據管理 一次開發多段部署 …… 3、鴻蒙多媒體技術 音頻 視頻 相機 圖片 …… 4、鴻蒙南向與驅動開發 物聯網 驅動開發 ……
    發表于 02-21 21:04

    華為鴻蒙系統怎么樣 華為鴻蒙系統和安卓系統的區別

    華為鴻蒙系統是華為公司自主研發的全場景分布式操作系統,于2019年8月首次發布。鴻蒙系統不同于傳統的操作
    的頭像 發表于 02-02 14:54 ?1791次閱讀

    鴻蒙千帆起】高德地圖攜手HarmonyOS NEXT,開啟智能出行新篇章

    德團隊的辛勤努力和不懈探索。目前,高德地圖在主圖、信息展示、規劃導航等基礎功能方面已完成了鴻蒙化,未來還將逐步在鴻蒙系統上實現更多特色功能。 在實踐分享環節,宋浩波深入剖析了高德地圖在鴻蒙
    發表于 02-02 11:09

    如何在鴻蒙系統上安裝Google Play

    隨著鴻蒙(HarmonyOS)系統的逐漸普及和用戶基數的增加,一些用戶希望能在鴻蒙系統上使用Google Play商店以獲取更多應用。然而,由于鴻蒙
    的頭像 發表于 01-31 17:13 ?1.6w次閱讀

    鴻蒙OS 線程管理開發指導

    場景介紹 如果應用的業務邏輯比較復雜,可能需要創建多個線程來執行多個任務。這種情況下,代碼復雜難以維護,任務與線程的交互也會更加繁雜。要解決此問題,開發者可以使用“TaskDispatcher”來
    的頭像 發表于 01-29 16:22 ?857次閱讀

    三相四線制中中線的作用是什么

    三相四線制是一種電力供應系統,它由三個相互偏移120度的交流電相和一個中性線組成。中線在這種制度中起著重要的作用。下面將詳細介紹中線在三相四線制中的作用。 首先,中線在電力
    的頭像 發表于 01-18 16:52 ?6453次閱讀

    鴻蒙系統和安卓的區別 鴻蒙系統有什么特別之處

    鴻蒙系統是華為公司自主研發的一款全新操作系統,旨在替代安卓系統鴻蒙系統與安卓
    的頭像 發表于 01-18 11:45 ?1.2w次閱讀
    主站蜘蛛池模板: 邓奴的视频IVK| 激情午夜307| 色即是空之甜性涩爱| 午夜精品久久久久久99热蜜桃 | 久久亚洲AV成人无码国产漫画| 混乱家庭电影完整版在线看| 嗯好大好猛皇上好深用力| 忘忧草日本在线WWW日本| 亚洲九九精品| 成人高清网站| 久久综合久综合久久鬼色| 無码一区中文字幕少妇熟女H | bl高h肉文| 韩国伦理片2018在线播放免费观看| 欧洲最强rapper潮水喷视频| 日韩 国产 欧美视频二区| 在线看片av以及毛片| 超污视频带污疼免费视频| 精品国产乱码久久久久久免费流畅| 亚洲AV电影天堂男人的天堂| 99久久国产露脸精品国产麻豆| 精子网久久国产精品| 色网址在线观看| 999zyz色资源站在线观看| SORA是什么意思| 久久免费看少妇高潮A片特爽| 无止侵犯高H1V3无止侵犯| jizz日本黄色| 美国特级成人毛片| 热久久伊大人香蕉网老师| 性色无码AV久久蜜臀| adc影院在线| 近亲乱中文字幕| 偷柏自拍亚洲综合在线| 97超碰在线视频 免费| 激情办公室| 亚洲国产成人在线| 极品少妇小泬50PTHEPON| 午夜熟女插插XX免费视频| 大肚婆孕妇网| 少女free大陆|