HarmonyOS ArkTS会不会支持多线程开发

HarmonyOS ArkTS会不会支持多线程开发

HarmonyOS
2024-08-27 14:32:00
浏览
收藏 0
回答 5
待解决
回答 5
按赞同
/
按时间
鱼弦CTO
1

HarmonyOS ArkTS 语言目前不直接支持多线程开发。ArkTS 是一种基于 TypeScript 的编程语言,主要用于编写前端和业务逻辑代码。尽管如此,HarmonyOS 提供了多种方式来实现异步任务和后台任务处理,以满足应用的并发需求。

### 异步编程

在没有原生多线程支持的情况下,异步编程是处理并发任务的常用方法。你可以使用以下几种方式来实现异步操作:

  1. Promise
  2. async/await
  3. 定时器(setTimeout, setInterval)

#### 示例代码

@Entry
@Component
struct MainComponent {
  build() {
    Column({
      alignItems: 'center',
      justification: 'center'
    }) {
      Button('Start Async Task')
        .onClick(() => this.startAsyncTask())
    }
  }

  async startAsyncTask() {
    console.log("Task started");
    await this.simulateAsyncOperation();
    console.log("Task finished");
  }

  simulateAsyncOperation(): Promise<void> {
    return new Promise((resolve) => {
      setTimeout(() => {
        console.log("Async operation done");
        resolve();
      }, 3000); // 模拟一个耗时3秒的异步操作
    });
  }
}

### WorkerPool (工人池)

对于需要更复杂的并发处理,可以考虑通过 NAPI 与底层 C/C++ 实现交互,来实现更高效的多线程任务。在这种情况下,你可以创建一个 C/C++ 模块,通过 NAPI 暴露接口给 ArkTS 使用。

#### 示例代码

假设你有一个计算密集型的任务,可以通过 C/C++ 多线程来加速处理。

C++ 代码:

#include <napi.h>
#include <thread>

void ComputeTask(const Napi::CallbackInfo& info) {
    Napi::Env env = info.Env();
    int32_t input = info[0].As<Napi::Number>().Int32Value();
    
    std::thread([input]() {
        // 模拟计算任务
        int result = input * 10;
        std::this_thread::sleep_for(std::chrono::seconds(3));
        // 在这里返回结果或进行其他操作
    }).detach();
}

Napi::Object Init(Napi::Env env, Napi::Object exports) {
    exports.Set(Napi::String::New(env, "computeTask"), Napi::Function::New(env, ComputeTask));
    return exports;
}

NODE_API_MODULE(addon, Init)

构建与引入:

按照之前提供的方式配置 ​​CMakeLists.txt​​ 并构建项目。

ArkTS 调用部分:

import { NativeModule } from '@ohos/napi';

@Entry
@Component
struct MainComponent {
  build() {
    Column({
      alignItems: 'center',
      justification: 'center'
    }) {
      Button('Start Compute Task')
        .onClick(() => this.startComputeTask())
    }
  }

  startComputeTask() {
    NativeModule.computeTask(42);
    console.log("Compute task started");
  }
}

### 总结

虽然 HarmonyOS 的 ArkTS 目前不直接支持多线程开发,但你仍然可以通过异步编程模型(如 ​​Promise​​ 和 ​​async/await​​)以及 NAPI 与底层 C/C++ 多线程实现交互来满足并发需求。根据具体需求选择合适的方法,可以有效地处理各种异步任务和后台任务。

分享
微博
QQ
微信
回复
2024-09-24 17:27:21
superinsect

taskpool目前只提供@Sendable的内存共享功能,可参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-sendable-V5

分享
微博
QQ
微信
回复
2024-08-27 19:07:06
因为活着就一定行

ArkTS 目前支持两种多线程并发的能力,分别是 TaskPool 或 Worker 能力,TaskPool与Worker两种多线程并发能力均是基于 ​Actor并发模型​实现的。

  1. 关于 TaskPool 能力

TaskPool在Worker之上实现了调度器和Worker线程池。在主线程(ArkTS Main Thread)中调用execute接口会将待执行的任务方法及参数信息,根据设置的任务优先级放入任务队列(TaskQueue)中等待调度执行。

// Index.ets代码
import { taskpool} from '@kit.ArkTS';
import Handle from './Handle'; // 返回静态句柄

// 步骤1: 定义并发函数,内部调用同步方法
@Concurrent
async function func(num: number): Promise<number> {
  // 调用静态类对象中实现的同步等待调用
  // 先调用syncSet方法并将其结果作为syncSet2的参数,模拟同步调用逻辑
  let tmpNum: number = Handle.syncSet(num);
  console.info("this is Child_Thread")
  return Handle.syncSet2(tmpNum);
}

// 步骤2: 创建任务并执行
async function asyncGet(): Promise<void> {
  // 创建task、task2并传入函数func
  let task: taskpool.Task = new taskpool.Task(func, 1);
  let task2: taskpool.Task = new taskpool.Task(func, 2);
  // 执行task、task2任务,await保证其同步执行
  let res: number = await taskpool.execute(task) as number;
  let res2: number = await taskpool.execute(task2) as number;
  // 打印任务结果
  console.info("taskpool: task res is: " + res);
  console.info("taskpool: task res2 is: " + res2);
}

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(async () => {
            // 步骤3: 执行并发操作
            asyncGet();
            let num: number = Handle.syncSet(100);
            console.info("this is Main_Thread!")
          })
      }
      .width('100%')
      .height('100%')
    }
  }
}


  1. 关于 Worker 能力

Worker拥有独立的运行环境,每个Worker线程和主线程一样拥有自己的内存空间、消息队列(MessageQueue)、事件轮询机制(EventLoop)、调用栈(CallStack)


// Index.ets
import { worker } from '@kit.ArkTS';

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            let w: worker.ThreadWorker = new worker.ThreadWorker('entry/ets/workers/MyWorker.ts');
            w.onmessage = (): void => {
              // 接收Worker子线程的结果
            }
            w.onerror = (): void => {
              // 接收Worker子线程的错误信息
            }
            // 向Worker子线程发送Set消息
            w.postMessage({'type': 0, 'data': 'data'})
            // 向Worker子线程发送Get消息
            w.postMessage({'type': 1})
            // ...
            // 根据实际业务,选择时机以销毁线程
            w.terminate()
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}
分享
微博
QQ
微信
回复
2024-08-28 02:15:32
码农小新

支持taskpool和worker,具体使用参考官方指南和API文档

分享
微博
QQ
微信
回复
2024-12-03 12:10:55
在敲键盘的小鱼干很饥饿

上面的学到了,牛牛牛

分享
微博
QQ
微信
回复
2024-12-12 19:09:58
相关问题
求大佬告知ArkTS是否支持多线程
2052浏览 • 1回复 待解决
ArkTs多线程方案如何保证线程安全
2581浏览 • 2回复 待解决
HarmonyOS是否支持多线程
147浏览 • 0回复 待解决
HarmonyOS 多线程写法限制
149浏览 • 1回复 待解决
HarmonyOS 多线程并发相关问题
250浏览 • 1回复 待解决
HarmonyOS 数据库多线程操作
187浏览 • 1回复 待解决
HarmonyOS多线程使用?
195浏览 • 0回复 待解决
如何使用taskpool实现多线程
1154浏览 • 1回复 待解决
HarmonyOS 多线程锁问题
488浏览 • 1回复 待解决
多线程中EGL如何共享Context
432浏览 • 1回复 待解决