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) {
// 做一些独立的任务
task.result = true
}
}
let task = new Task()
let thread = new Thread(() => {
let result = task.run(args)
// 处理结果
})
ArkTS写法:
import { taskpool } from '@kit.ArkTS';
@Concurrent
function runner(task: Task) {
task.run();
}
@Sendable
class Task {
run() {
// 处理结果
return true;
}
}
let task = new Task();
taskpool.execute(runner, task).then((res) => {
// ...
})
场景四:子线程主动更新主线程状态。代码示例: 共享内存写法:
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
}
可以利用TaskPool接口转换,大概可以分为如下五个场景:
共享内存写法:
ArkTS写法:
共享内存写法:
ArkTS写法:
共享内存写法:
ArkTS写法:
共享内存写法:
ArkTS写法:
ArkTS写法:
参考链接
并发概述