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

news2025/1/12 10:08:55

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);
    }
}

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何用saga实现分布式事务?

SAGA事务介绍 SAGA事务模式的历史十分悠久&#xff0c;比分布式事务的概念提出还要更早。SAGA的意思是“长篇故事、长篇记叙、一长串事件”&#xff0c;它起源于1987年普林斯顿大学的赫克托 加西亚 莫利纳&#xff08;Hector Garcia Molina&#xff09;和肯尼斯 麦克米伦&a…

python之万花尺

1、使用模块 import sys, random, argparse import numpy as np import math import turtle import random from PIL import Image from datetime import datetime from math import gcd 依次使用pip下载即可 2、代码 import sys, random, argparse import numpy as np imp…

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

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

智慧公厕建设的主要目标是什么?

随着城市化进程的不断推进&#xff0c;公共厕所作为城市基础设施的重要组成部分&#xff0c;也变得越来越重要。为了提升公共厕所的管理水平、提供更好的服务质量&#xff0c;智慧公厕应运而生。智慧公厕的建设旨在通过信息化手段实现公共厕所的全面感知监测&#xff0c;实现公…

单片机学到什么程度才可以去工作?

单片机学到什么程度才可以去工作? 如果没有名校或学位的加持&#xff0c;你还得再努力一把&#xff0c;才能从激烈的竞争中胜出。以下这些技能可以给你加分&#xff0c;你看情况学&#xff0c;不同行业对这些组件会有取舍: . Cortex-M内核:理解MCU内核各部件的工作机制&#…

【黑马程序员】Python综合案例

文章目录 数据分析案例目的需求数据准备实践数据记录类 文件解析解析csv格式解析json文件 进行数据计算读取文件数据按日期累加数据 图表展示图标绘制最终效果展示 数据分析案例 目的 文件操作实践json库使用三方库pyecharts使用面向对象实践数据容器使用 需求 给定一个csv…

3.1_10 段页式管理方式

3.1_10 段页式管理方式 &#xff08;一&#xff09;分页、分段的优缺点分析 基于分页、分段的优缺点&#xff0c;人们想出了将分页、分段结合&#xff0c;就产生了段页式管理。段页式管理具备了分页、分段各自的优点。 &#xff08;二&#xff09;分段分页段页式管理 将进程按逻…

JavaScript 中实现请求并发控制

文章目录 浏览器并发请求限制数&#xff08;图&#xff09;实现代码三方插件 假设有 30 个待办任务要执行&#xff0c;而我们希望限制同时执行的任务个数&#xff0c;即最多只有 3 个任务能同时执行。当正在执行任务列表 中的任何 1 个任务完成后&#xff0c;程序会自动从 待办…

Flink程序员开发利器本地化WebUI生成

前言 在flink程序开发或者调试过程中&#xff0c;每次部署到集群上都需要不断打包部署&#xff0c;其实是比较麻烦的事情&#xff0c;其实flink一直就提供了一种比较好的方式使得开发同学不用部署就可以观察到flink执行情况。 上代码 第一步&#xff1a;开发之前需要引入在本…

【C/C++】C语言开发者必读:迈向C++的高效编程之旅

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方…

虚拟机 VMware下载及安装

centos官网&#xff1a;CentOS Mirror 虚拟机vmware官网&#xff1a;VMware 官网 一直点下一步就好了&#xff0c;有些配置按需修改即可 创建新的虚拟机 处理内核总数不能大于自己主机的逻辑处理器 安装操作系统&#xff1a;引入centos镜像 然后就可以点击开启此虚拟机&#xf…

操作系统(OS)

文章目录 前言一、操作系统是什么&#xff1f;二、用户对资源的访问三、操作系统是怎么做到管理的&#xff1f; 前言 任何计算机系统都包含一个基本的程序集合&#xff0c;称为操作系统(OS)。冯诺依曼体系结构中的硬件单元提供的功能&#xff0c;这些硬件由操作系统来控制与管…

Rocket MQ 从入门到实践

为什么要使用消息队列&#xff0c;解决什么问题&#xff1f;&#xff08;消峰、解藕、异步&#xff09; 消峰填谷 客户端》 网关 〉 消息队列》秒杀服务 异步解耦 消息队列中的重要概念理解。&#xff08;主题、消费组、队列&#xff0c;游标&#xff1f;&#xff09; 主题&…

C++向函数传递函数

函数指针的定义格式为&#xff1a; <函数返回类型> (*指针变量)(<函数形参列表>) 例如&#xff1a; 下面定义了一个函数指针变量fp: double (*fp)(int);这意味着fp可以指向返回类型为double,参数类型为int的任何函数 比如&#xff1a; double func(int x){...}获…

基于springboot的购物商城管理系统

1.项目简介 1.1 用户简介 用户主要分为管理员和用户端&#xff1a; 管理员&#xff1a; 管理员可以对后台数据进行管理、拥有最高权限、具体权限有登录后进行首页轮播图的配置管理、商品的配置、新品家具商城的配置管理、、家具商城分类管理配置、家具商城详情商品管理、用户…

【Rockchip 安10.1 默认给第三方apk默认开启所有权限】

Rockchip 安10.1 默认给第三方apk默认开启所有权限 问题描述解决方法 郑重声明:本人原创博文&#xff0c;都是实战&#xff0c;均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Rockchip 3229 OS:Android 10.1 Kernel: 4.19 问题描述 有些第三方或者主界面&…

openEuler学习总结1(仅供学习参考)

华为的openEuler内核是源于Linux。 openEuler操作系统安装流程 第一步&#xff1a;开启虚拟化 第二步&#xff1a;安装一个虚拟化软件virtualbox 第三步&#xff1a;镜像 第四步&#xff1a;配置 设置虚拟机所在的目录 把网卡类型选择成桥接网卡 挂载镜像 设置完成&#xff0…

Git——修改历史记录详解

目录 Git1、修改历史信息1.1、启动互动模式1.2、修改Commit信息的影响1.3、取消Rebase 2、多个Commit合并位一个Commit3、一个Commit拆解成多个Commit4、在某些Commit之间插入新的Commit5、删除Commit6、调整Commit的顺序7、Revert指令7.1、取消Commit7.2、取消Revert1、再开一…

9. 综合案例-ATM系统 (1~7节知识综合练习)

ATM系统_综合大练习 今天的任务是对之前所有的学习的知识, 进行一个综合性的大练习. 老师说的好, 键盘敲烂 这个项目我写了大量的注释给大家参考, 如果有同学是跟着我的系列学习的, 一定动手练一练. 下面的代码只要按着敲是可以直接运行起来的, 我也把完整代码上传到了CSDN上…

17.WEB渗透测试--Kali Linux(五)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;16.WEB渗透测试--Kali Linux&#xff08;四&#xff09;-CSDN博客 1.ettercap简介与使用…