如何将类Java语言的线程模型(内存共享)的实现方式转换成在ArkTS的线程模型下(内存隔离)的实现方式
可以利用TaskPool接口转换,大概可以分为如下五个场景:
- 场景一:主线程将独立的耗时任务放到子线程执行。代码示例:
共享内存写法:
class Task { static run(args) { // 做一些独立的任务 } } let thread = new Thread(() => { let result = Task.run(args) // deal with result })ArkTS写法:
import { taskpool } from '@kit.ArkTS'; @Concurrent function run(args: number) { // 做一些独立的任务 } let task: taskpool.Task = new taskpool.Task(run, 100); // 100: test number taskpool.execute(task).then((res) => { // Return result }); - 场景二:主线程将创建的类对象实例在子线程使用。代码示例:
共享内存写法:
class Material { action(args) { // 做一些独立的任务 } } let material = new Material() let thread = new Thread(() => { let result = material.action(args) // deal with result })ArkTS写法:
import { taskpool } from '@kit.ArkTS'; @Concurrent function runner(material: Material): void { return material.action(100); // 100: test number } @Sendable class Material { action(args: number) { // 做一些独立的任务 } } let material = new Material() taskpool.execute(runner, material).then((ret) => { // 返回结果 }) - 场景三:子线程主动更新主线程状态。代码示例:
共享内存写法:
class Task { run(args) { // deal with result runOnUiThread(() => { UpdateUI(result) }) } } let task = new Task() let thread = new Thread(() => { let result = task.run(args) // 处理结果 })ArkTS写法:
import taskpool from '@ohos.taskpool' @Concurrent function runner(task) { task.run() } @Sendable class Task { run(args) { // 做一些独立的任务 taskpool.Task.sendData(result) } } let task = new Task() let run = new taskpool.Task(runner, task) run.onReceiveData((result) => { UpdateUI(result) }) taskpool.execute(run).then((ret) => { // 返回结果 }) - 场景四:子线程同步调用主线程的接口。代码示例:
class SdkU3d { static getInst() { return SdkMgr.getInst(); } getPropStr(str: string) { return xx; } } let thread = new Thread(() => { // 游戏线程 let sdk = SdkU3d.getInst() let ret = sdk.getPropStr("xx") })ArkTS写法:
import { MessageEvents, taskpool, worker } from '@kit.ArkTS'; class SdkU3d { static getInst(): Object { return SdkMgr.getInst(); } getPropStr(str: string) { } } let workerInstance = new worker.ThreadWorker("xx/worker.ts"); workerInstance.registerGlobalCallObject("instance_xx", SdkU3d.getInst()); workerInstance.postMessage("start"); // 游戏worker线程 const mainPort = worker.workerPort; mainPort.onmessage = (e: MessageEvents): void => { let ret = mainPort.callGlobalCallObjectMethod("instance_xx", "getPropStr", 100); // 100:test number }
&spm=1001.2101.3001.5002&articleId=144737630&d=1&t=3&u=a7071c1d6a624c19b04bc1f0015a6c62)
1315

被折叠的 条评论
为什么被折叠?



