|
同步任务是指在多个线程之间协调执行的任务,其目的是确保多个任务按照一定的顺序和规则执行,例如使用锁来防止数据竞争。
同步任务的实现需要考虑多个线程之间的协作和同步,以确保数据的正确性和程序的正确执行。
由于TaskPool偏向于单个独立的任务,因此当各个同步任务之间相对独立时推荐使用TaskPool,例如一系列导入的静态方法,或者单例实现的方法。如果同步任务之间有关联性,则需要使用Worker,例如无法单例创建的类对象实现的方法。
使用TaskPool处理同步任务
当调度独立的任务,或者一系列任务为静态方法实现,或者可以通过单例构造唯一的句柄或类对象,可在不同任务线程之间使用时,推荐使用TaskPool。
- 定义并发函数,内部调用同步方法。
- 创建任务Task,通过execute()接口执行该任务,并对任务返回的结果进行操作。
- 执行并发操作。
模拟一个包含同步调用的单实例类。
// Handle.ts 代码export default class Handle { sta tic getInstance(): void { // 返回单例对象 } static syncGet(): void { // 同步Get方法 } static syncSet(num: number): number { // 模拟同步步骤1 console.info("taskpool: this is 1st print!"); // 模拟同步步骤2 console.info("taskpool: this is 2nd print!"); return num++; }}业务使用TaskPool调用相关同步方法的代码。
// Index.ets代码import taskpool from '@ohos.taskpool';import Handle from './Handle'; // 返回静态句柄// 步骤1: 定义并发函数,内部调用同步方法@Concurrentfunction func(num: number): boolean { // 调用静态类对象中实现的同步等待调用 Handle.syncSet(num); return true;}// 步骤2: 创建任务并执行async function asyncGet(): Promise { // 创建task并传入函数func let task: taskpool.Task = new taskpool.Task(func, 1); // 执行task任务 let res: boolean = await taskpool.execute(task) as boolean; // 打印任务结果 console.info("taskpool: task res is: " + res);}@Entry@Componentstruct Index { @State message: string = 'Hello World'; build() { Row() { Column() { Text(this.message) .fontSize(50) .fontWeight(FontWeight.Bold) .onClick(() => { // 步骤3: 执行并发操作 asyncGet(); }) } .width('100%') .height('100%') } }} 使用Worker处理关联的同步任务
当一系列同步任务需要使用同一个句柄调度,或者需要依赖某个类对象调度,无法在不同任务池之间共享时,需要使用Worker。
- 在主线程中创建Worker对象,同时接收Worker线程发送回来的消息。
import worker from '@ohos.worker';@Entry@Componentstruct Index { @State message: string = 'Hello World'; build() { Row() { Column() { Text(this.message) .fontSize(50) .fontWeight(FontWeight.Bold) .onClick(() => { let w: worker.ThreadWorker = new worker.ThreadWorker('entry/ets/workers/MyWorker.ts'); w.onmessage = (): void => { // 接收Worker子线程的结果 } w.onerror = (): void => { // 接收Worker子线程的错误信息 } // 向Worker子线程发送Set消息 w.postMessage({'type': 0, 'data': 'data'}) // 向Worker子线程发送Get消息 w.postMessage({'type': 1}) // ... // 根据实际业务,选择时机以销毁线程 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' // 返回句柄let workerPort : ThreadWorkerGlobalScope = worker.workerPort;// 无法传输的句柄,所有操作依赖此句柄let handler: Handle = new Handle()// Worker线程的onmessage逻辑workerPort.onmessage = (e : MessageEvents): void => { switch (e.data.type as number) { case 0: handler.syncSet(e.data.data); workerPort.postMessage('success set'); case 1: handler.syncGet(); workerPort.postMessage('success get'); }}
|