HarmonyOS鸿蒙Next之线程01——ParallelTaskDispatcher派发任务

HarmonyOS鸿蒙Next之线程01——ParallelTaskDispatcher派发任务 创建一个名为“ParallelTaskDispatcher”的设备类型任务,用于演示ParallelTaskDispatcher任务分发器派发任务的使用。

修改ability_main.xml

修改ability_main.xml内容如下:

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:orientation="vertical">

    <Text
        ohos:id="$+id:text_start_parallel_task_dispatcher"
        ohos:height="match_parent"
        ohos:width="match_content"
        ohos:background_element="$graphic:background_ability_main"
        ohos:layout_alignment="horizontal_center"
        ohos:text="Start ParallelTaskDispatcher"
        ohos:text_size="50"/>

</DirectionalLayout>

显示界面效果如下图1所示

图1

自定义任务

MyTask是自定义的一个任务。该任务逻辑比较简单,只是模拟了一个耗时的操作。

package com.waylau.hmos.paralleltaskdispatcher;

import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
import java.util.concurrent.TimeUnit;

public class MyTask implements Runnable {
    private static final String TAG = MyTask.class.getSimpleName();
    private static final HiLogLabel LABEL_LOG =
        new HiLogLabel(HiLog.LOG_APP, 0x00001, TAG);

    private String taskName;

    public MyTask(String taskName) {
        this.taskName = taskName;
    }

    @Override
    public void run() {
        HiLog.info(LABEL_LOG, "before %s run", taskName);
        int task1Result = getRandomInt();
        try {
            // 模拟一个耗时的操作
            TimeUnit.MILLISECONDS.sleep(task1Result);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        HiLog.info(LABEL_LOG, "after %s run, result is: %s", taskName, task1Result);
    }

    // 返回随机整数
    private int getRandomInt() {
        // 获取[0, 1000)之间的int整数。方法如下:
        double a = Math.random();
        int result = (int) (a * 1000);
        return result;
    }
}

这个耗时操作,是通过获取一个随机数,而后根据随机数执行线程sleep实现的。

执行任务派发

修改MainAbilitySlice,增加任务派发器相关的逻辑。

package com.waylau.hmos.paralleltaskdispatcher.slice;

import com.waylau.hmos.paralleltaskdispatcher.MyTask;
import com.waylau.hmos.paralleltaskdispatcher.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Text;
import ohos.app.dispatcher.Group;
import ohos.app.dispatcher.TaskDispatcher;
import ohos.app.dispatcher.task.TaskPriority;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
import java.util.Random;
import java.util.concurrent.TimeUnit;

public class MainAbilitySlice extends AbilitySlice {
    private static final String TAG = MainAbilitySlice.class.getSimpleName();
    private static final HiLogLabel LABEL_LOG =
        new HiLogLabel(HiLog.LOG_APP, 0x00001, TAG);

    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);

        Text textStartDispatcher =
            (Text) findComponentById(ResourceTable.Id_text_start_parallel_task_dispatcher);
        textStartDispatcher.setClickedListener(listener -> startDispatcher());
    }

    // 指定任务排发
    private void startDispatcher() {
        String dispatcherName = "MyDispatcher";

        TaskDispatcher dispatcher = this.getContext().createParallelTaskDispatcher(dispatcherName, TaskPriority.DEFAULT);

        Group group = dispatcher.createDispatchGroup();

        dispatcher.asyncGroupDispatch(group, new MyTask("task1"));

        dispatcher.asyncGroupDispatch(group, new MyTask("task2"));

        dispatcher.groupDispatchNotify(group, new MyTask("task3"));
    }

    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }
}

上述代码,

  • Text增加了点击事件,以触发startDispatcher任务
  • startDispatcher方法中创建了ParallelTaskDispatcher任务派发器
  • 创建了三个MyTask任务实例,这些任务都是一个任务组。
  • task1task2通过asyncGroupDispatch方式异步派发。
  • task3通过groupDispatchNotify方式派发。groupDispatchNotify方式是需要等任务组中的所有任务执行完成后才会执行指定任务。
9 回复

还得多看啊,楼主厉害

更多关于HarmonyOS鸿蒙Next之线程01——ParallelTaskDispatcher派发任务的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


感谢支持,请期待后续的更新

又学会一点,真是哈哈哈

眼睛看了,但脑袋不会,嘻嘻

一直觉得这内容有内涵

膜拜呀,请接受我的膝盖

你们太厉害啦,我可不行

在HarmonyOS中,ParallelTaskDispatcher是用于并行任务派发的类。它允许开发者将任务分配到多个线程中并行执行,以提高应用程序的性能和响应速度。ParallelTaskDispatcher通过TaskDispatcher接口提供任务派发功能,支持任务的同步和异步执行。

使用ParallelTaskDispatcher时,开发者可以通过GlobalTaskDispatcher获取其实例,然后调用asyncDispatchsyncDispatch方法来派发任务。asyncDispatch用于异步执行任务,不会阻塞当前线程;syncDispatch用于同步执行任务,会阻塞当前线程直到任务完成。

ParallelTaskDispatcher适用于需要并行处理多个独立任务的场景,例如图像处理、数据计算等。通过合理使用ParallelTaskDispatcher,可以充分利用多核CPU的计算能力,提升应用程序的执行效率。

在HarmonyOS鸿蒙Next中,ParallelTaskDispatcher用于并行派发任务。它通过GlobalTaskDispatcher获取实例,支持多线程并发执行任务。使用asyncDispatch方法异步派发任务,任务会在后台线程中执行,不会阻塞主线程。syncDispatch方法则同步派发任务,任务会在当前线程中执行,直到任务完成。ParallelTaskDispatcher适用于需要并发处理的场景,如多任务下载、并行计算等,能有效提升系统性能。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!