国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

    文章

    509

    瀏覽量

    20826
  • 鴻蒙系統
    +關注

    關注

    183

    文章

    2642

    瀏覽量

    69847

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    中線安全守護者!安科瑞中線安防保護器根治零線電流過大隱患

    在低壓配電系統中,中性線(簡稱“中線”)作為電流回流的必經之路,其安全性常常被忽視。隨著現代電力系統中非線性負載的大量增加,中線電流過大、斷線、過壓等問題日益凸顯,成為電氣火災和設備損
    的頭像 發表于 02-05 09:23 ?119次閱讀
    <b class='flag-5'>中線</b>安全守護者!安科瑞<b class='flag-5'>中線</b>安防保護器根治零線電流過大隱患

    ANSNP中線安防為末端配電系統”保駕護航“

    中線電纜發熱,加速絕緣老化 2)損壞電氣設備,三相電壓不平衡加劇 3)影響計量準確性或引發保護裝置誤動作 4)觸電風險增加,造成接地故障隱患 基于以上問題,安科瑞終端電氣治理裝置——ANSNP中線安防保護器可滿足對末端供配電系統
    的頭像 發表于 01-20 11:24 ?316次閱讀
    ANSNP<b class='flag-5'>中線</b>安防為末端配電<b class='flag-5'>系統</b>”保駕護航“

    解析Linux的進程、線程和協程

    系統資源。線程的引入使得多核處理器得以充分利用,因為多線程程序可以更有效地分配和管理多核心的計算資源。 線程的特點包括: (1)共享性
    發表于 12-22 11:00

    線程系統

    ,我們把這個程序主體分割成一個個獨立的,無限循環且不能返回的小程序,這個小程序我們稱之為線程。 每個線程都是獨立的,互不干擾的,且具備自身的優先級,它由操作系統調度管理。加入操作
    發表于 12-08 07:55

    鴻蒙系統對手機市場會產生怎樣的影響?現在汽車是不是也用上鴻蒙系統了?

    鴻蒙系統對手機市場會產生怎樣的影響?現在汽車是不是也用上鴻蒙系統了?
    發表于 12-04 20:47

    Linux多線程對比單線程的優勢

    在Linux系統中,線程是操作系統能夠進行運算調度的最小單位。線程被包含在進程之中,是進程中的實際運行單位。一個進程可以擁有多個線程,這些
    發表于 12-01 06:11

    為什么需要中線安防保護器?

    簡婷 安科瑞電氣股份有限公司 上海嘉定 ?201801 技術支持18701998775 ? 治理中線電能質量問題的設備通常被稱為中線安防保護器或中線電流消除器。這類設備主要用于解決三相四線制供電
    的頭像 發表于 10-24 16:05 ?691次閱讀
    為什么需要<b class='flag-5'>中線</b>安防保護器?

    聚焦中線防護痛點,安科瑞中線安防保護器賦能多場景用電安全

    在電氣安全防護體系中,中線(中性線)作為電力系統的關鍵組成部分,其穩定性直接關系到用電設備的安全運行與人員觸電風險防控。安科瑞中線安防保護器作為針對中線故障的專項防護設備,能有效解決
    的頭像 發表于 09-19 16:50 ?725次閱讀
    聚焦<b class='flag-5'>中線</b>防護痛點,安科瑞<b class='flag-5'>中線</b>安防保護器賦能多場景用電安全

    HDC 2025:鴻蒙星閃,軟硬結合,絕佳“CP”

    分布式軟總線的技術特性,成為萬物智聯時代的數字底座,可以作為智家中樞,統一調度和管理智能設備。開源鴻蒙具有獨立、開放、中立的特點,基于開源鴻蒙系統來構建智慧家庭的
    的頭像 發表于 06-22 17:31 ?7025次閱讀
    HDC 2025:<b class='flag-5'>鴻蒙</b>星閃,軟硬結合,絕佳“CP”

    鴻蒙5開發寶藏案例分享---跨線程性能優化指南

    發現鴻蒙寶藏:跨線程序列化性能優化實戰指南 大家好呀!今天在翻鴻蒙文檔時挖到一個超級實用的工具—— DevEco Profiler的序列化檢測功能 !平時用<span class
    發表于 06-12 17:13

    鴻蒙5開發寶藏案例分享---分析幀率問題

    ); } } 原因 : 循環計算阻塞主線程,無法在8.3ms(120Hz)內完成渲染。 優化方案 :改用系統動畫API ,GPU自動插值計算,解放主線程。 優化后代碼 : Button(\'click
    發表于 06-12 17:07

    鴻蒙5開發寶藏案例分享---應用并發設計

    ?** 鴻蒙并發編程實戰指南:解鎖ArkTS多線程黑科技** 嘿,開發者朋友們! 今天給大家扒一扒鴻蒙官方文檔里藏著的并發編程寶藏—— 100+實戰場景解決方案 !從金融理財到游戲開發,從折疊屏適配
    發表于 06-12 16:19

    國產操作系統加速崛起——鴻蒙電腦補齊鴻蒙生態最重要拼圖

    國產操作系統加速崛起——鴻蒙電腦補齊鴻蒙生態最重要拼圖 5月19日,首次應用鴻蒙操作系統的個人電腦(PC)在四川成都正式發布。這標志著我國擁
    的頭像 發表于 05-21 11:41 ?676次閱讀

    鴻蒙操作系統首登電腦端,華為開啟鴻蒙辦公新時代

    2025年5月8日,華為在深圳舉辦了鴻蒙電腦技術與生態溝通會,鴻蒙操作系統首次在電腦端亮相。這既是中國電子信息產業的歷史性時刻,也是華為鴻蒙辦公的新起點。 五年匠心打磨,
    發表于 05-08 14:20 ?6076次閱讀
    <b class='flag-5'>鴻蒙</b>操作<b class='flag-5'>系統</b>首登電腦端,華為開啟<b class='flag-5'>鴻蒙</b>辦公新時代

    深度融入“純血鴻蒙”|芯海科技旗下康柚OKOK首批入駐鴻蒙NEXT系統

    3月20日,隨著首款全面搭載純血鴻蒙系統的"寬折疊"手機PuraX的發布,全面鴻蒙時代正悄然到來。鴻蒙NEXT(純血鴻蒙)自正式亮相以來,這
    的頭像 發表于 03-21 18:04 ?1571次閱讀
    深度融入“純血<b class='flag-5'>鴻蒙</b>”|芯海科技旗下康柚OKOK首批入駐<b class='flag-5'>鴻蒙</b>NEXT<b class='flag-5'>系統</b>