|

HarmonyOS

模组

HarmonyOS之线程01——ParallelTaskDispatcher派发任务

创建一个名为“ParallelTaskDispatcher”的Car设备类型的任务,用于演示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所示

 

 

自定义任务

 

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 %{public}s run", taskName);
       
int task1Result = getRandomInt();
       
try {
           
// 模拟一个耗时的操作
           
TimeUnit.MILLISECONDS.sleep(task1Result);
        }
catch (InterruptedException e) {
            e.printStackTrace();
        }

        HiLog.info(
LABEL_LOG, "after %{public}s run, result is: %{public}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();

       
// 将任务1加入任务组
       
dispatcher.asyncGroupDispatch(group, new MyTask("task1"));

       
// 将与任务1相关联的任务2加入任务组
       
dispatcher.asyncGroupDispatch(group, new MyTask("task2"));

       
// task3必须要等任务组中的所有任务执行完成后才会执行
       
dispatcher.groupDispatchNotify(group, new MyTask("task3"));
    }


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

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

 

 

上述代码,

 

l  Text增加了点击事件,以触发startDispatcher任务

l  startDispatcher方法中创建了ParallelTaskDispatcher任务派发器

l  创建了三个MyTask任务实例,这些任务都是一个任务组。

l  task1task2通过asyncGroupDispatch方式异步派发。

l  task3通过groupDispatchNotify方式派发。groupDispatchNotify方式是需要等任务组中的所有任务执行完成后才会执行指定任务。

 

运行

 

运行应用后,点击2次界面文本“Start ParallelTaskDispatcher”以触发任务派发。此时,控制台输出如下:

 

01-15 11:29:18.180 15991-16685/com.waylau.hmos.paralleltaskdispatcher I 00001/MyTask: before task1 run

01-15 11:29:18.181 15991-16686/com.waylau.hmos.paralleltaskdispatcher I 00001/MyTask: before task2 run

01-15 11:29:18.338 15991-16686/com.waylau.hmos.paralleltaskdispatcher I 00001/MyTask: after task2 run, result is: 157

01-15 11:29:18.974 15991-16685/com.waylau.hmos.paralleltaskdispatcher I 00001/MyTask: after task1 run, result is: 793

01-15 11:29:18.976 15991-16744/com.waylau.hmos.paralleltaskdispatcher I 00001/MyTask: before task3 run

01-15 11:29:19.248 15991-16744/com.waylau.hmos.paralleltaskdispatcher I 00001/MyTask: after task3 run, result is: 269

 

01-15 11:29:22.499 15991-16946/com.waylau.hmos.paralleltaskdispatcher I 00001/MyTask: before task1 run

01-15 11:29:22.500 15991-16947/com.waylau.hmos.paralleltaskdispatcher I 00001/MyTask: before task2 run

01-15 11:29:22.666 15991-16947/com.waylau.hmos.paralleltaskdispatcher I 00001/MyTask: after task2 run, result is: 166

01-15 11:29:23.203 15991-16946/com.waylau.hmos.paralleltaskdispatcher I 00001/MyTask: after task1 run, result is: 704

01-15 11:29:23.204 15991-16995/com.waylau.hmos.paralleltaskdispatcher I 00001/MyTask: before task3 run

01-15 11:29:23.750 15991-16995/com.waylau.hmos.paralleltaskdispatcher I 00001/MyTask: after task3 run, result is: 545

 

 

分别执行了两次,可以看到 task1 taks2先后顺序是随机的,但task3一定是在task1 taks2完成之后,才会执行。

 

源码

 

更多示例源码,见《跟老卫学HarmonyOS   https://github.com/waylau/harmonyos-tutorial


点赞
5
收藏
5
回复
7
分享
举报
浏览2115 编辑于2021-01-15 06:18未知归属地
全部评论
最多点赞
最新发布
最早发布
写回答
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。
发表

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。