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

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

HarmonyOS
2024-03-17 13:42:30
2706浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
踮脚在树梢上

可以利用TaskPool接口转换,大概可以分为如下五个场景:

  • 场景一:主线程将独立的耗时任务放到子线程执行。代码示例:

共享内存写法:

class Task { 
  static run(args) { 
    // 做一些独立的任务 
  } 
} 
let thread = new Thread(() => { 
  let result = Task.run(args) 
  // deal with result 
})
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

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 
});
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 主线程将创建的类对象实例在子线程使用。代码示例:

共享内存写法:

class Material { 
  action(args) { 
    // 做一些独立的任务 
  } 
} 
let material = new Material() 
let thread = new Thread(() => { 
  let result = material.action(args) 
  // deal with result 
})
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

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) => { 
  // 返回结果 
})
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 场景三:主线程将独立的耗时任务放到子线程执行。代码示例:

共享内存写法:

class Task { 
  run(args) { 
    // 做一些独立的任务 
    task.result = true 
  } 
} 
let task = new Task() 
let thread = new Thread(() => { 
  let result = task.run(args) 
  // 处理结果 
})
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

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) => { 
  // ... 
})
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 场景四:子线程主动更新主线程状态。代码示例:

共享内存写法:

class Task { 
    run(args) { 
        // deal with result 
        runOnUiThread(() => { 
            UpdateUI(result) 
        }) 
    } 
} 
let task = new Task() 
let thread = new Thread(() => { 
    let result = task.run(args) 
    // 处理结果 
})
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

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) => { 
    // 返回结果 
})
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 场景五:子线程同步调用主线程的接口。代码示例:
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") 
})
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

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 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

参考链接

并发概述

分享
微博
QQ
微信
回复
2024-03-18 16:40:28


相关问题
如何将AndroidAPP转换成鸿蒙
302浏览 • 1回复 已解决
Worker线程内存如何共享
3066浏览 • 1回复 待解决
Actor线程内存如何共享
1068浏览 • 1回复 待解决
TaskPool线程内存如何共享
2856浏览 • 1回复 待解决
HarmonyOS 如何将汉字转换成拼音
937浏览 • 1回复 待解决
如何将某个时间转换成距现在时间
1208浏览 • 1回复 待解决
如何将文件转换成字符串
1101浏览 • 1回复 待解决
请问如何将openblock文件转换成exe文件
3120浏览 • 0回复 待解决
HarmonyOS 内存模型是什么样
1235浏览 • 1回复 待解决
ArkTS 异步编程模型如何实现?
1011浏览 • 0回复 待解决
什么是系统线程模型
1029浏览 • 1回复 待解决
HarmonyOS Promise,await/async 线程模型
681浏览 • 1回复 待解决
HAP和HAR运行时内存模型
1096浏览 • 1回复 待解决
json 如何转换成自定义业务对象
1549浏览 • 1回复 待解决