鸿蒙HarmonyOS学习笔记(9)

如何将类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 
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yuwinter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值