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

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

HarmonyOS
2024-03-17 13:42:30
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
blue76

可以利用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 
}

参考链接

并发概述

分享
微博
QQ
微信
回复
2024-03-18 16:40:28
相关问题
TaskPool线程内存如何共享
193浏览 • 1回复 待解决
Worker线程内存如何共享
189浏览 • 1回复 待解决
请问如何将openblock文件转换成exe文件
704浏览 • 0回复 待解决
有哪些创建线程方式
335浏览 • 1回复 待解决
如何实现线程数据共享
213浏览 • 1回复 待解决
系统多线程模型是什么样
126浏览 • 1回复 待解决
如何base64转换成图片?
7823浏览 • 2回复 待解决
ArkTS语言内存管理,会自己管理吗
226浏览 • 1回复 待解决
如何将时间戳转换为日期格式时间
331浏览 • 1回复 待解决
是否有线程安全容器
254浏览 • 1回复 待解决