W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
同步任務是指在多個線程之間協(xié)調(diào)執(zhí)行的任務,其目的是確保多個任務按照一定的順序和規(guī)則執(zhí)行,例如使用鎖來防止數(shù)據(jù)競爭。
同步任務的實現(xiàn)需要考慮多個線程之間的協(xié)作和同步,以確保數(shù)據(jù)的正確性和程序的正確執(zhí)行。
由于TaskPool偏向于單個獨立的任務,因此當各個同步任務之間相對獨立時推薦使用TaskPool,例如一系列導入的靜態(tài)方法,或者單例實現(xiàn)的方法。如果同步任務之間有關(guān)聯(lián)性,則需要使用Worker,例如無法單例創(chuàng)建的類對象實現(xiàn)的方法。
當調(diào)度獨立的同步任務,或者一系列同步任務為靜態(tài)方法實現(xiàn),或者可以通過單例構(gòu)造唯一的句柄或類對象,可在不同任務池之間使用時,推薦使用TaskPool。
定義并發(fā)函數(shù),內(nèi)部調(diào)用同步方法。
創(chuàng)建任務,并通過TaskPool執(zhí)行,再對異步結(jié)果進行操作。創(chuàng)建Task,通過execute()執(zhí)行同步任務。
模擬一個包含同步調(diào)用的單實例類。
- // Handle.ts 代碼
- export default class Handle {
- static getInstance() {
- // 返回單例對象
- }
- static syncGet() {
- // 同步Get方法
- return;
- }
- static syncSet(num: number) {
- // 同步Set方法
- return;
- }
- }
業(yè)務使用TaskPool調(diào)用相關(guān)同步方法的代碼。
- // Index.ets代碼
- import taskpool from '@ohos.taskpool';
- import Handle from './Handle'; // 返回靜態(tài)句柄
- // 步驟1: 定義并發(fā)函數(shù),內(nèi)部調(diào)用同步方法
- @Concurrent
- function func(num: number) {
- // 調(diào)用靜態(tài)類對象中實現(xiàn)的同步等待調(diào)用
- Handle.syncSet(num);
- // 或者調(diào)用單例對象中實現(xiàn)的同步等待調(diào)用
- Handle.getInstance().syncGet();
- return true;
- }
- // 步驟2: 創(chuàng)建任務并執(zhí)行
- async function asyncGet() {
- // 創(chuàng)建task并傳入函數(shù)func
- let task = new taskpool.Task(func, 1);
- // 執(zhí)行task任務,獲取結(jié)果res
- let res = await taskpool.execute(task);
- // 對同步邏輯后的結(jié)果進行操作
- console.info(String(res));
- }
- @Entry
- @Component
- struct Index {
- @State message: string = 'Hello World';
- build() {
- Row() {
- Column() {
- Text(this.message)
- .fontSize(50)
- .fontWeight(FontWeight.Bold)
- .onClick(() => {
- // 步驟3: 執(zhí)行并發(fā)操作
- asyncGet();
- })
- }
- .width('100%')
- .height('100%')
- }
- }
- }
當一系列同步任務需要使用同一個句柄調(diào)度,或者需要依賴某個類對象調(diào)度,無法在不同任務池之間共享時,需要使用Worker。
在主線程中創(chuàng)建Worker對象,同時接收Worker線程發(fā)送回來的消息。
- import worker from '@ohos.worker';
- @Entry
- @Component
- struct Index {
- @State message: string = 'Hello World';
- build() {
- Row() {
- Column() {
- Text(this.message)
- .fontSize(50)
- .fontWeight(FontWeight.Bold)
- .onClick(() => {
- let w = new worker.ThreadWorker('entry/ets/workers/MyWorker.ts');
- w.onmessage = function (d) {
- // 接收Worker子線程的結(jié)果
- }
- w.onerror = function (d) {
- // 接收Worker子線程的錯誤信息
- }
- // 向Worker子線程發(fā)送Set消息
- w.postMessage({'type': 0, 'data': 'data'})
- // 向Worker子線程發(fā)送Get消息
- w.postMessage({'type': 1})
- // ...
- // 根據(jù)實際業(yè)務,選擇時機以銷毀線程
- w.terminate()
- })
- }
- .width('100%')
- }
- .height('100%')
- }
- }
在Worker線程中綁定Worker對象,同時處理同步任務邏輯。
- // handle.ts代碼
- export default class Handle {
- syncGet() {
- return;
- }
- syncSet(num: number) {
- return;
- }
- }
- // MyWorker.ts代碼
- import worker, { ThreadWorkerGlobalScope, MessageEvents } from '@ohos.worker';
- import Handle from './handle.ts' // 返回句柄
- var workerPort : ThreadWorkerGlobalScope = worker.workerPort;
- // 無法傳輸?shù)木浔?,所有操作依賴此句?/span>
- var handler = new Handle()
- // Worker線程的onmessage邏輯
- workerPort.onmessage = function(e : MessageEvents) {
- switch (e.data.type) {
- case 0:
- handler.syncSet(e.data.data);
- workerPort.postMessage('success set');
- case 1:
- handler.syncGet();
- workerPort.postMessage('success get');
- }
- }
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: