如何将类Java语言的线程模型(内存共享)的实现方式转换成在ArkTS的线程模型下(内存隔离)的实现方式?

如何将类Java语言的线程模型(内存共享)的实现方式转换成在ArkTS的线程模型下(内存隔离)的实现方式

阅读 308
1 个回答

可以利用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) { 
    // 做一些独立的任务 
    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 
}

参考链接

并发概述

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进