30.HarmonyOS App(JAVA)鸿蒙系统app多线程任务分发器

HarmonyOS App(JAVA)多线程任务分发器

打印时间,记录到编辑框textfield信息显示

同步分发,异步分发,异步延迟分发,分组任务分发,屏蔽任务分发,多次任务分发

参考代码注释

场景介绍

如果应用的业务逻辑比较复杂,可能需要创建多个线程来执行多个任务。这种情况下,代码复杂难以维护,任务与线程的交互也会更加繁杂。要解决此问题,开发者可以使用“TaskDispatcher”来分发不同的任务。

接口说明

TaskDispatcher是一个任务分发器,它是Ability分发任务的基本接口,隐藏任务所在线程的实现细节。

为保证应用有更好的响应性,我们需要设计任务的优先级。在UI线程上运行的任务默认以高优先级运行,如果某个任务无需等待结果,则可以用低优先级。

表1 线程优先级介绍

优先级

详细描述

HIGH

最高任务优先级,比默认优先级、低优先级的任务有更高的几率得到执行。

DEFAULT

默认任务优先级, 比低优先级的任务有更高的几率得到执行。

LOW

低任务优先级,比高优先级、默认优先级的任务有更低的几率得到执行。

TaskDispatcher具有多种实现,每种实现对应不同的任务分发器。在分发任务时可以指定任务的优先级,由同一个任务分发器分发出的任务具有相同的优先级。系统提供的任务分发器有GlobalTaskDispatcher、ParallelTaskDispatcher、SerialTaskDispatcher 、SpecTaskDispatcher。

  • GlobalTaskDispatcher

    全局并发任务分发器,由Ability执行getGlobalTaskDispatcher()获取。适用于任务之间没有联系的情况。一个应用只有一个GlobalTaskDispatcher,它在程序结束时才被销毁。

     
      
    1. TaskDispatcher globalTaskDispatcher = getGlobalTaskDispatcher(TaskPriority.DEFAULT);
  • ParallelTaskDispatcher

    并发任务分发器,由Ability执行createParallelTaskDispatcher()创建并返回。与GlobalTaskDispatcher不同的是,ParallelTaskDispatcher不具有全局唯一性,可以创建多个。开发者在创建或销毁dispatcher时,需要持有对应的对象引用 。

     
      
    1. String dispatcherName = "parallelTaskDispatcher";
    2. TaskDispatcher parallelTaskDispatcher = createParallelTaskDispatcher(dispatcherName, TaskPriority.DEFAULT);
  • SerialTaskDispatcher

    串行任务分发器,由Ability执行createSerialTaskDispatcher()创建并返回。由该分发器分发的所有的任务都是按顺序执行,但是执行这些任务的线程并不是固定的。如果要执行并行任务,应使用ParallelTaskDispatcher或者GlobalTaskDispatcher,而不是创建多个SerialTaskDispatcher。如果任务之间没有依赖,应使用GlobalTaskDispatcher来实现。它的创建和销毁由开发者自己管理,开发者在使用期间需要持有该对象引用。

     
      
    1. String dispatcherName = "serialTaskDispatcher";
    2. TaskDispatcher serialTaskDispatcher = createSerialTaskDispatcher(dispatcherName, TaskPriority.DEFAULT);
  • SpecTaskDispatcher

    专有任务分发器,绑定到专有线程上的任务分发器。目前已有的专有线程为UI线程,通过UITaskDispatcher进行任务分发。

    UITaskDispatcher:绑定到应用主线程的专有任务分发器, 由Ability执行getUITaskDispatcher()创建并返回。 由该分发器分发的所有的任务都是在主线程上按顺序执行,它在应用程序结束时被销毁。

     
      
    1. TaskDispatcher uiTaskDispatcher = getUITaskDispatcher();
<?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:alignment="center"
    ohos:orientation="vertical">

    <Text
        ohos:id="$+id:text_helloworld"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:background_element="$graphic:background_ability_main"
        ohos:layout_alignment="horizontal_center"
        ohos:text="$string:mainability_HelloWorld"
        ohos:text_size="40vp"
        />
    <Button
        ohos:id="$+id:btn_tongbu"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:background_element="#EB0BF647"
        ohos:layout_alignment="horizontal_center"
        ohos:text="同步分发"
        ohos:text_size="40vp"
        />
    <Button
        ohos:id="$+id:btn_yibu"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:background_element="#EB3D5DFC"
        ohos:layout_alignment="horizontal_center"
        ohos:text="异步分发"
        ohos:text_size="40vp"
        />
    <Button
        ohos:id="$+id:btn_yibu_yanchi"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:background_element="#EB0BF647"
        ohos:layout_alignment="horizontal_center"
        ohos:text="异步延迟分发"
        ohos:text_size="40vp"
        />
    <Button
        ohos:id="$+id:btn_fenzhu_task"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:background_element="#EB3D5DFC"
        ohos:layout_alignment="horizontal_center"
        ohos:text="分组任务分发"
        ohos:text_size="40vp"
        />
    <Button
        ohos:id="$+id:btn_pingbi_task"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:background_element="#EB0BF647"
        ohos:layout_alignment="horizontal_center"
        ohos:text="屏蔽任务分发"
        ohos:text_size="40vp"
        />
    <Button
        ohos:id="$+id:btn_duoci_task"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:background_element="#EB3D5DFC"
        ohos:layout_alignment="horizontal_center"
        ohos:text="多次任务分发"
        ohos:text_size="40vp"
        />

    <Text
        ohos:id="$+id:text_label"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:background_element="$graphic:background_ability_main"
        ohos:layout_alignment="left"
        ohos:text="信息显示:"
        ohos:multiple_lines="true"
        ohos:text_size="20vp"
        />
    <TextField
        ohos:id="$+id:text_filed_info"
        ohos:height="300vp"
        ohos:background_element="#FC0A84EF"
        ohos:text="信息显示区域"
        ohos:width="350vp"
        ohos:hint=""
        ohos:margin="2vp"
        ohos:text_size="20vp"/>
    <Clock
        ohos:id="$+id:clock"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:background_element="#FF80EF66"
        ohos:layout_alignment="left"

        ohos:text_size="20vp"
        />






</DirectionalLayout>
package com.example.myapplication.slice;

import com.example.myapplication.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.*;
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.function.Consumer;


public class MainAbilitySlice extends AbilitySlice {
    static final HiLogLabel label = new HiLogLabel(HiLog.INFO,0x00101,"shanshui");
    TextField textField;
    Clock clock2;
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);

        HiLog.info(label,  "hellocdtxw");
        HiLog.info(label,  "%{public}s World %d", "hellocdtxw", 3);
        HiLog.info(label,  "%{public}s World %d", "hellocdtxw", 3);
        System.out.println("hellocdtxw");

        Button btn_tongbu = (Button) findComponentById(ResourceTable.Id_btn_tongbu);
         textField = (TextField) findComponentById(ResourceTable.Id_text_filed_info);
         clock2 = (Clock) findComponentById(ResourceTable.Id_clock);
        clock2.setFormatIn24HourMode("yyyy-MM-dd HH:mm:ss");
        Button btn_yibu = (Button) findComponentById(ResourceTable.Id_btn_yibu);
        Button btn_delay = (Button) findComponentById(ResourceTable.Id_btn_yibu_yanchi);
        Button btn_group = (Button ) findComponentById(ResourceTable.Id_btn_fenzhu_task);
        Button btn_pingbi = (Button) findComponentById(ResourceTable.Id_btn_pingbi_task);
        Button btn_more_time = (Button) findComponentById(ResourceTable.Id_btn_duoci_task);
        btn_more_time.setClickedListener(new Component.ClickedListener() {
            @Override
            public void onClick(Component component) {
                MoreTimesTask();
            }
        });
        btn_delay.setClickedListener(new Component.ClickedListener() {
            @Override
            public void onClick(Component component) {
                YibuDealyTask();
            }
        });
        btn_group.setClickedListener(new Component.ClickedListener() {
            @Override
            public void onClick(Component component) {
                YibuGroupTask();
            }
        });
        btn_pingbi.setClickedListener(new Component.ClickedListener() {
            @Override
            public void onClick(Component component) {
                PingBiTask();
            }
        });
        btn_yibu.setClickedListener(new Component.ClickedListener() {
            @Override
            public void onClick(Component component) {
                YibuTask();
            }
        });
        btn_tongbu.setClickedListener(new Component.ClickedListener() {
            @Override
            public void onClick(Component component) {
                HiLog.info(label,  "hellocdtxw");
                HiLog.info(label,  "%{public}s World %d", "hellocdtxw", 3);
                HiLog.info(label,  "%{public}s World %d", "hellocdtxw", 3);
                System.out.println("hellocdtxw");
                TongBuTask();
            }
        });

    }
    /*
    同步分发任务,多线程,阻塞模式,会卡主界面,不常用
     */
    public void TongBuTask()
    {
        TaskDispatcher dispatcher =
                getGlobalTaskDispatcher(TaskPriority.DEFAULT);
         String time_str = clock2.getText();
        textField.append(time_str+":同步线程启动\n");
        dispatcher.syncDispatch(new Runnable() {
            @Override
            public void run() {
                try
                {
                   //getUITaskDispatcher().syncDispatch(()->{
                   // textField.append(clock2.getText()+":task1:"+Thread.currentThread().getName());
                   //});

                   Thread.sleep(1000);
                }
                catch (InterruptedException e)
                {
                    //getUITaskDispatcher().syncDispatch(()->{
                       //  textField.append(clock2.getText()+"任务失败");
                   // });

                }

            }
        });
        dispatcher.syncDispatch(new Runnable() {
            @Override
            public void run() {
                try
                {
                    //getUITaskDispatcher().syncDispatch(()->{
                    // textField.append(clock2.getText()+":task1:"+Thread.currentThread().getName());
                    //});

                    Thread.sleep(1000);
                }
                catch (InterruptedException e)
                {
                    //getUITaskDispatcher().syncDispatch(()->{
                    //  textField.append(clock2.getText()+"任务失败");
                    // });

                }

            }
        });
        dispatcher.syncDispatch(new Runnable() {
            @Override
            public void run() {
                try
                {
                    //getUITaskDispatcher().syncDispatch(()->{
                    // textField.append(clock2.getText()+":task1:"+Thread.currentThread().getName());
                    //});

                    Thread.sleep(1000);
                }
                catch (InterruptedException e)
                {
                    //getUITaskDispatcher().syncDispatch(()->{
                    //  textField.append(clock2.getText()+"任务失败");
                    // });

                }

            }
        });

    }
   //异步模式,鸿蒙系统app多线程
    public  void YibuTask()
    {
        TaskDispatcher dispatcher =
                getGlobalTaskDispatcher(TaskPriority.DEFAULT);
        String time_str = clock2.getText();
        textField.append(time_str+":异步线程启动\n");
        dispatcher.asyncDispatch(new Runnable() {
            @Override
            public void run() {
                try
                {
                    getUITaskDispatcher().asyncDispatch(()->{
                     textField.append(clock2.getText()+":task1:"+Thread.currentThread().getName()+"\n");
                    });

                    Thread.sleep(1000);
                }
                catch (InterruptedException e)
                {
                    getUITaskDispatcher().asyncDispatch(()->{
                      textField.append(clock2.getText()+"任务失败");
                     });

                }

            }
        });
        dispatcher.asyncDispatch(new Runnable() {
            @Override
            public void run() {
                try
                {
                    getUITaskDispatcher().asyncDispatch(()->{
                        textField.append(clock2.getText()+":task2:"+Thread.currentThread().getName()+"\n");
                    });

                    Thread.sleep(1000);
                }
                catch (InterruptedException e)
                {
                    getUITaskDispatcher().asyncDispatch(()->{
                        textField.append(clock2.getText()+"任务失败");
                    });

                }

            }
        });
        dispatcher.asyncDispatch(new Runnable() {
            @Override
            public void run() {
                try
                {
                    getUITaskDispatcher().asyncDispatch(()->{
                        textField.append(clock2.getText()+":task3:"+Thread.currentThread().getName()+"\n");
                    });

                    Thread.sleep(1000);
                }
                catch (InterruptedException e)
                {
                    getUITaskDispatcher().asyncDispatch(()->{
                        textField.append(clock2.getText()+"任务失败");
                    });

                }

            }
        });
    }
    //异步延迟任务分发
    public  void YibuDealyTask()
    {
        TaskDispatcher dispatcher =
                getGlobalTaskDispatcher(TaskPriority.DEFAULT);
        String time_str = clock2.getText();

        dispatcher.delayDispatch(()-> {
            getUITaskDispatcher().asyncDispatch(()->{
                textField.append(time_str+":异步延迟任务分发线程启动\n");
            });


        },1000);


    }
    //异步分组任务分发
    public  void YibuGroupTask()
    {
        TaskDispatcher dispatcher =
                getGlobalTaskDispatcher(TaskPriority.DEFAULT);
        String time_str = clock2.getText();
        Group group = dispatcher.createDispatchGroup();

        dispatcher.asyncGroupDispatch(group, new Runnable() {
            @Override
            public void run() {

                HiLog.info(label,  "%{public}s World %d", "hellocdtxw", 3);
            }

        });
        dispatcher.asyncGroupDispatch(group, new Runnable() {
            @Override
            public void run() {
                HiLog.info(label,  "%{public}s World %d", "hellocdtxw", 3);
            }

        });
        dispatcher.asyncGroupDispatch(group, new Runnable() {
            @Override
            public void run() {
                HiLog.info(label,  "%{public}s World %d", "hellocdtxw", 3);
            }

        });


    }
    //屏蔽任务分发
    public void PingBiTask()
    {
        TaskDispatcher dispatcher =
                createParallelTaskDispatcher("Dispatcher",
                        TaskPriority.DEFAULT);
        Group group = dispatcher.createDispatchGroup();
        dispatcher.asyncGroupDispatch(group,()->{
            try
            {
                Thread.sleep(1000);
                HiLog.info(label,  "%{public}s World %d", "hellocdtxw", 3);
            }
            catch (InterruptedException ex)
            {

            }

        });
        dispatcher.asyncGroupDispatch(group,()->{
            try
            {
                Thread.sleep(1000);
                HiLog.info(label,  "%{public}s World %d", "hellocdtxw", 3);
            }
            catch (InterruptedException ex)
            {

            }

        });
        dispatcher.asyncDispatchBarrier(()->{
            try
            {
                Thread.sleep(1000);
                getUITaskDispatcher().asyncDispatch(()->{
                    textField.append(clock2.getText()+":屏蔽任务分发线程启动\n");
                });
            }
            catch (InterruptedException ex)
            {

            }
        });
        dispatcher.asyncGroupDispatch(group,()->{
            try
            {
                Thread.sleep(1000);
                HiLog.info(label,  "%{public}s World %d", "hellocdtxw", 3);
            }
            catch (InterruptedException ex)
            {

            }

        });
        dispatcher.asyncGroupDispatch(group,()->{
            try
            {
                Thread.sleep(1000);
                HiLog.info(label,  "%{public}s World %d", "hellocdtxw", 3);
            }
            catch (InterruptedException ex)
            {

            }

        });
        dispatcher.asyncDispatchBarrier(()->{
            try
            {
                Thread.sleep(1000);
                getUITaskDispatcher().asyncDispatch(()->{
                    textField.append(clock2.getText()+":屏蔽任务分发线程启动\n");
                });
            }
            catch (InterruptedException ex)
            {

            }
        });

    }
    public void MoreTimesTask()
    {
        getGlobalTaskDispatcher(TaskPriority.DEFAULT).applyDispatch(new Consumer<Long>() {
            @Override
            public void accept(Long aLong) {
                getUITaskDispatcher().asyncDispatch(()->{
                    textField.append(clock2.getText()+":多次任务分发线程启动"+aLong.toString()+"\n");
                });
            }
        },10); //执行10次
    }

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

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

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/464422.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【技术类-04】python实现docx表格文字和段落文字的“手动换行符(软回车)”变成“段落标记(硬回车)”

作品展示&#xff1a; 背景需求&#xff1a; 把python实现docx表格文字和段落文字的“手动换行符&#xff08;软回车&#xff09;”变成“段落标记&#xff08;硬回车&#xff09;合并在一起统计数量 【技术类-02】python实现docx段落文字的“手动换行符&#xff08;软回车&a…

Prometheus 轻量化部署和使用

文章目录 说明Prometheus简介Grafana简介prometheus和Grafana的关系环境准备&#xff08;docker&#xff09;docker安装时间时区问题&#xff08;我的代码中&#xff09;dockers镜像加速和服务器时区设置 数据库准备(mysql、redis)mysql配置redis配置 Prometheus、grafana下载和…

4-如何进行细分市场分析-03 竞争者分析

任何一个行业肯定都是有很多竞争者&#xff0c;我们如何判断这些竞争者对我们有什么样的威胁、什么样的机会、什么样的影响&#xff0c;我们需要去分析这些竞争者。 行业竞争格局如何分析&#xff1f; 我们可以从一些基本指标来入手&#xff0c;如市场集中度、行业利润率。 竞…

Win10系统使用IIS服务搭建WebDAV网站结合内网穿透公网访问本地文件

文章目录 推荐1. 安装IIS必要WebDav组件2. 客户端测试3. cpolar内网穿透3.1 打开Web-UI管理界面3.2 创建隧道3.3 查看在线隧道列表3.4 浏览器访问测试 4. 安装Raidrive客户端4.1 连接WebDav服务器4.2 连接成功4.2 连接成功总结&#xff1a; 推荐 前些天发现了一个巨牛的人工智能…

短剧小程序软件开发首页接口转发到Selectpage

工具&#xff1a;用的是uniapp开发 技术栈&#xff1a;vue、nide..js、云开发 用时&#xff1a;20工作天 软件&#xff1a;Hb、微信开发者工具 <?php namespace app\api\controller; use app\common\controller\Api; /** * 首页接口 */ class Index extends Api { …

算法思想总结:滑动窗口算法

创作不易&#xff0c;感谢三连 一.长度最小的数组 . - 力扣&#xff08;LeetCode&#xff09;长度最小的数组 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int lenINT_MAX,nnums.size(),sum0;//len必须要给一个很大的数&#xf…

【LeetCode每日一题】2684. 矩阵中移动的最大次数

文章目录 [2684. 矩阵中移动的最大次数](https://leetcode.cn/problems/maximum-number-of-moves-in-a-grid/)思虑&#xff1a;代码&#xff1a; 2684. 矩阵中移动的最大次数 思虑&#xff1a; 1.将第一列的所有行坐标&#xff0c;用IntStream 来生成一个范围 [0, m) 内的整数…

reloading,一个很实用的Python库!

Python是一门非常流行的编程语言&#xff0c;它的广泛应用和丰富的第三方库使得开发者们能够轻松完成各种任务。reloading是Python中一个强大的库&#xff0c;它能够在程序运行时重新加载修改过的模块&#xff0c;为开发者提供了便利和灵活性。本文将全面介绍reloading库&#…

警惕MKP勒索病毒,您需要知道的预防和恢复方法。

引言&#xff1a; 在网络世界中&#xff0c;.mkp勒索病毒是一股威胁不可小觑的黑暗势力。它以其毒辣的加密手段威胁着我们的数据安全。本文将深入介绍.mkp勒索病毒&#xff0c;揭示如何恢复被其加密的数据文件&#xff0c;并分享一些预防措施&#xff0c;助您在数字世界中安全…

整数和浮点数在内存中存储及题目

一、整数在内存中存储 整数的2进制表⽰⽅法有三种&#xff0c;即原码、反码和补码。三种表⽰⽅法均有符号位和数值位两部分&#xff0c;符号位都是⽤0表⽰“正”&#xff0c;⽤1表⽰“负”&#xff0c;⽽数值位最⾼位的⼀位是被当做符号位&#xff0c;剩余的都是数值位 正整数…

使用ChatGPT高效完成简历制作[中篇]-有爱AI实战教程(五)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 导读&#xff1a;在使用 ChatGPT 时&#xff0c;当你给的指令越精确&#xff0c;它的回答会越到位&#xff0c;举例来说&#xff0c;假如你要请它帮忙写文案&#xff0c;如果没…

【JS进阶】第一天

参考视频——黑马程序员 JavaScript 进阶 - 第 1 天 学习作用域、变量提升、闭包等语言特征&#xff0c;加深对 JavaScript 的理解&#xff0c;掌握变量赋值、函数声明的简洁语法&#xff0c;降低代码的冗余度。 理解作用域对程序执行的影响能够分析程序执行的作用域范围理解闭…

后端程序员入门react笔记(八)-redux的使用和项目搭建

一个更好用的文档 添加链接描述 箭头函数的简化 //简化前 function countIncreAction(data) {return {type:"INCREMENT",data} } //简化后 const countIncreAction data>({type:"INCREMENT",data })react UI组件库相关资料 组件库连接和推荐 antd组…

electron 学习

const { app, BrowserWindow } require(electron); const path require(path); function createWindow () {let mainWin new BrowserWindow({x: 100,y: 100,show:false, // 默认不显示窗体width: 800,height: 800,maxHeight: 1000,maxWidth: 1000,minHeight: 400,minWidth: …

Linux学习(4)——使用编辑器

1.gedit编辑器 简单易懂&#xff0c;依赖图形界面。可以使用ctrlc ctrlv等快捷键&#xff0c;ctrls进行保存&#xff0c;与windows系统中相类似。 2.vi/vim编辑器 vi/vim可以直接通过控制台的终端完成文本的编辑&#xff0c;不依赖图形界面&#xff0c;使用范围更广。它的编辑…

安装Pytorch——CPU版本

安装Pytorch——CPU版本 1. 打开pytorch官网2. 选择pip安装pytorch-cpu3.复制安装命令4. 在cmd命令窗口&#xff0c;进入你的虚拟环境4.1 创建虚拟环境4.2 进行安装 5. 安装成功6. 进行测试——如下面步骤&#xff0c;如图6.1 输入 python6.2 输入 import torch6.2 输入 print …

【Web开发】CSS教学(超详细,满满的干货)

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【Web开发】CSS教学(超详细,满满的干货) &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 CSS一. 什么是CSS?1.1 基本语法规范1.2 引入方式1.3 规范 二. CSS选…

Spring Web MVC入门(3)

学习Spring MVC 请求 传递JSON数据 JSON概念 JSON: JavaScript Object Natation JSON是一种轻量的数据交互格式, 采用完全独立于编程语言的文本格式来存储和标识数据. 简单来说, JSON是一种数据格式, 有自己的格式和语法, 使用文本来表示对象或数组的信息, 因此JSON的本质…

下载、安装Maven

官网搜索Maven 进入官网 点击下载

蓝桥杯每日一题 走迷宫bfs 超超详细解释!!!

昨天学习了bfs的基本概念&#xff0c;今天来做一道经典习题练练手吧&#xff01; bfs常用的两类题型 1.从A出发是否存在到达B的路径(dfs也可) 2.从A出发到B的最短路径&#xff08;数小:<20才能用dfs&#xff09; 遗留的那个问题的答案- 题目&#xff1a;走迷宫 答案&…