第十八章 多线程处理

2023-10-30

1、多线程基础
1.1 基本概念

  • 进程:进程是操作系统中的一个基本概念,进程包含了一个程序运行所需的资源,一个进程包含多个线程。
  • 线程:线程是进程的基本执行单元,进程入口执行的第一个进程称为主线程。
  • 任务:任务是一个工作单元,目的是生成结果值,或产生想要的效果。任务代表需要执行的一个作业,而线程是代表这个作业的工作者。
  • 线程池:多个线程的集合,决定如何处理线程分配的逻辑。

1.2 多线程的性能问题

善用多线程可以提高程序的执行效率,例如要长时间处理数据时,可以将处理工作在其他线程中执行,避免主线程出现假死状态,也可以提高程序效率。然而,上下文切换是有代价的。必须将CPU当前的内部状态保存到内存,还必须加载与新线程关联的状态。如果线程太多,切换开销也会随之增加,反而会影响程序性能。

 

2、System.Threading.Thread

System.Threading.Thread是用于控制线程的基础类,通过Thread可以控制当前应用程序中线程的创建、挂起、停止、销毁。

2.1 常用属性

  • CurrentContext——获取线程正在其中执行的当前上下文
  • CurrentThread——获取当前正在运行的线程
  • ExecutionContext——获取包含有关当前线程的各种上下文信息的对象
  • IsAlive——获取一个值,该值指示当前线程的执行状态
  • IsBackground——获取或设置一个值,该值指示某个线程是否为后台线程
  • IsThreadPoolThread——获取一个值,该值指示线程是否属于托管线程
  • ManagedThreadId——获取当前托管线程的唯一标识
  • Priority——获取或设置一个值,该值指示线程的调度优先级
  • ThreadState——获取一个值,该值包含当前线程的状态

2.2 常用方法

  • Start()——执行本线程
  • Join()——阻塞调用线程,直到某个线程终止为止,可以传递int或TimeSpan参数,设置阻塞线程的事件
  • Suspend()——挂起当前线程,如果当前线程已属于挂起则不起作用
  • Resume()——继续运行已挂起的线程,如果线程没有挂起则引发异常
  • Sleep()——将正在运行的线程挂起,挂起事件可能超过指定的时间长度
  • Abort()——终止线程,尽量不要终止线程

2.3 Thread类的使用

Thread提供初始化方法有两个重载方法,分别是传递ThreadStart委托和ParameterizedThreadStart委托。两者的区别是后者可以接收参数。当调用Thread对象的Start()后,便开始异步执行委托方法。

2.4 实例

在ShowMessage()方法中输出当前线程Id,并使用Sleep()方法模拟长时间的处理工作,在主线程中创建并开始执行异步执行。

class Program

{

    static void Main()

    {

        Console.WriteLine("Main ThreadId is : {0}", Thread.CurrentThread.ManagedThreadId);

        Thread thread = new Thread(ShowMessage);

        thread.Start();

        Console.WriteLine("Main thread working is Complete!");

    }

    private static void ShowMessage()

    {

        Console.WriteLine("ThreadId = {0}", Thread.CurrentThread.ManagedThreadId);

        for (int i = 0; i < 10; i++)

        {

            Thread.Sleep(100);

            Console.WriteLine("The Number is {0}", i.ToString());

        }

}

使用ParameterizedThreadStart委托接收参数并输出

public class Person

{

    public string Name {get; set;}

    public string Age {get; set;}

}

class Program

{

    static

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第十八章 多线程处理 的相关文章

  • 抖音一键生成的AI绘画火了,网友惊呼:有点东西

    在各大AI绘画软件争奇斗艳的时候 近期最火的AI绘画莫过于抖音一键生成的AI绘画特效 网友惊呼 有点东西 就连最近话题度超高的 汪小菲 也用AI绘画来 秀 恩爱了 AI绘画识别度还挺高 特别是关于大白志愿者的生成效果 AI竟然能识别生成天使
  • postman—post方式几种请求格式的区别

    文章目录 前言 一 multipart form data与x www form urlencoded区别 二 使用时的一些细节 三 传参注意点总结 关于发送请求传入参数 总结 前言 介绍了postman中 常用的几种数据传参的特点 一 m
  • Elasticsearch的数据备份和恢复以及迁移

    目录 1 为什么备份 2 数据备份 3 数据恢复 4 ES备份数据迁移目标服务器 5 脚本备份恢复 1 为什么备份 常见的数据库都会提供备份机制 以解决在数据库无法使用的情况下通过备份来恢复数据减少损失 Elasticsearch 虽然有良
  • Pytorch建模过程中的DataLoader与Dataset

    pre line height 125 td linenos normal color inherit background color rgba 0 0 0 0 padding left 5px padding right 5px spa
  • python每日学5:python工程(大型项目)的组织架构:包、模块、类、方法

    题外话 在大型项目中 往往一个个模块已经不够组织起项目了 就比如一个文件夹下放了上千个文件 那想找到某一个文件就会变得困难 管理学中有种说法 一个管理者最适合管理 的对象是7个 假如程序的基本单元是函数 一个类包含7个函数 一个模块包含7个
  • C#怎么判断一个Socket是否连接

    判断Socket是否连接上 需要通过发包来确认 1 检查一个Socket是否可连接 2 private bool IsSocketConnected Socket client 3 4 bool blockingState client B
  • openGL之API学习(八十一)glsl的双精度double-precision

    10年以前的旧显卡基本上是没有双精度的 新显卡使用双精度需要开启GL ARB vertex attrib 64bit 和 GL ARB gpu shader fp64扩展 并且显卡架构要在SM5以上 就算有些显卡支持双精度类型 但是一些函数
  • java学生信息管理系统MVC架构

    一 项目结构 学生信息管理系统分三层进行实现 student java主要提供数据 cotroller java的功能是绑定试图和计算数据 Stuview java用于单一的用来显示数据 二 源码 1 1 Student 类 FileNam
  • 利用altium怎么生成PDF及怎么1:1打印文档

    画完板子之后 还要生成原理图PDF文档 供其他设计人员参考和指正 上图红框标注的两个地方 分别用于打印预览设置和生成原理图PDF 那么若是生成原理图PDF文档 则选择smart PDF即可 点击smart PDF后 点击next 上图中可以
  • vs如何断点?如何判断循环语句哪次出问题?

    红色的小点 按Fn F9 鼠标打字停在哪一行就会在哪一行 可以切换断点 再按一下则小红点消失 黄色的箭头 按Fn F10 再按Fn F10 就会到下一行 如果按Fn F5箭头会直接跳到红色的小点处 怎么看循环语句哪一次循环出问题呢 在断点
  • 算法:用Java实现双轴快速排序(DualPivotQuickSort)

    本文是用Java实现双轴快速排序 我找不到参考的文章地址了 十分抱歉 在此感谢参考文章的原作者 是你给了我思路和灵感 双轴快速排序和普通的快速排序不同的地方在于 普通的快速排序选出一个数字 作为一个基准值 然后通过数组值交换的方式 让左边区
  • Ant Design Pro项目中 提示:找不到模块“@ant-design/pro-components”或其相应的类型声明

    Ant Design Pro中在使用 StatisticCard 指标卡组件时候 按照官方的文档从 ant design pro components 中引入这个组件发现会报错 提示找不到模块 ant design pro componen
  • [659]linux安装RabbitMQ

    文章目录 安装Erlang 安装rabbitmq 关闭防火墙 否则非本地设备无法访问RabbitMQ服务 查看RabbitMQ运行状态 设置开机启动 添加用户 删除一个用户 修改用户的密码 设置用户角色 查看用户 设置用户权限 添加虚拟机
  • java 打印 发票_基于Excel和Java自动化:发票生成器

    对于销售人员 使用Excel创建发票是很常见的 但是该过程通常涉及许多容易出错的手动操作 例如输入数据 复制 粘贴等 如何实现一个可以将数据从数据库自动填充到发票Excel模板中 而无需再辛苦手动输入 从繁重的手动录入中解脱出来 并且避免认
  • win10计算器rsh_厉害了我的哥!win10计算器自带程序员模式太强大了!

    生活工作中常常会遇到用计算器的地方 比如算工资 算房贷啦 算卡路里等 一个有诸多功能的计算器能帮你省去大部分时间 你们知道吗 在windows计算器里 竟然还有程序员模式 可进行各种逻辑运算 快来和小编一起来看一下吧 相信大家Windows
  • C++几个关键字总结——const、static、extern、volatile

    1 const const 基本原理 被修饰的对象的值不可以被修改 const 推出的初始目的 正是为了取代预编译指令 消除它的缺点 同时继承它的优点 1 const修饰基本数据类型 表示常量 必须进行初始化 有以下两种初始化的方式 编译时
  • 数据分析中的mysql基础

    引言 之前的博客对mysql的一些入门知识进行了讲解 该博客将对sql的四个分类进行讲解 之前博客地址 https blog csdn net weixin 45696161 article details 106310108 sql的分类
  • python热度图改坐标_python matplotlib imshow热图坐标替换/映射实例

    今天遇到了这样一个问题 使用matplotlib绘制热图数组中横纵坐标自然是图片的像素排列顺序 但是这样带来的问题就是画出来的x y轴中坐标点的数据任然是x y在数组中的下标 实际中我们可能期望坐标点是其他的一个范围 如图 坐标点标出来的是
  • 笔记本关机后耗电严重问题怎么解决?一秒快速解决笔记本电脑关机掉电快的问题

    前言 或许许多使用笔记本的朋友都会遇到一个很头疼的问题 那就是笔记本关机放一段时间后 一周以内或者几个小时 电池电量消耗非常大 那么到底是什么原因导致笔记本关机后耗电快呢 如何解决耗电快的问题呢 下面详细讲述问题点及其解决方法 几个问题点

随机推荐

  • mysql数据库字符集_超详细的MySQL数据库字符集总结,值得收藏

    MySQL支持多种字符集 character set 提供用户存储数据 同时允许用不同排序规则 collation 做比较 下面基于MySQL5 7介绍一下字符集相关变量的使用 一 字符集 字符序的概念与联系 在数据的存储上 MySQL提供
  • c语言负数翻转问题

    1 在项目中 我们经常会用到变量 那么在变量的定义和传递过程中 经常会出现负数的翻转问题 int test funtion return 1 void poll fun unsigned int a while a gt 250 print
  • 你是一名努力工作的程序员,还是懒惰的程序员?

    当人们在进行一项体力工作时 你很容易评估他们工作的努力程度 你可以看到他们的身体动作 看他们流了多少汗水 也可以去看他们的工作成果 砖墙越砌越高 地上的洞越来越大 对努力工作的认可和奖励是人类一个非常基本的本能 这也是为什么我们对耐力运动如
  • 自已动手修改同花顺K线周期的快捷键

    同花顺的1分钟 5分钟 15分钟 30分钟 60分钟的K线周期快捷键为M1 M5 M15 M3 M6 不像大智慧为1 2 3 4 操作很是方便 让我们来把它给改一改 1 下载Restorator http www downxia com d
  • Java批量发带远程附件的邮件2--发送远程附件

    业务背景及需求 公司需要统一发送同类型的邮件给一批人时 比如发送员工个人薪资表分别至个人邮箱 此类邮件标题 内容 发送人等基本一致 且需要带附件 而其附件是收件人的隐私性个人信息 若通过上传文件保存到数据库里然后在发邮件的方式 浪费空间和时
  • WiFi以及天线测试项目详解

    1 相关术语 天线增益 天线增益就是某天线在最大辐射方向上的辐射能量跟点源天线 dBi 或偶极子天线 dBd 在同方向上的辐射能量的比值 天线规格书的几个参数 Gain dBi 在相同的输入功率下 天线在空间某点的辐射功率与理想无方向性点源
  • zabbix详解(十一)——zabbix监控MySQL性能实战

    今天继续给大家介绍Linux运维相关知识 本文主要内容是zabbix监控MySQL性能 一 实战目的 通过在zabbix客户端编写脚本 实现对MySQL数据库的性能进行信息进行提取 并配置成zabbix的监控项 以实现zabbix对MySQ
  • CSDN,这东西我得退了

    断更了那么久 得有个交代了 Albus Dumbledore好我是兄弟们 这一年里很高兴认识大家 CSDN这东西也让我接触到了很多有关技术和编程之类的东西 也收获了很多粉丝 但是 我因为学业及其他原因 这个网站我得先退了 账号我不会注销 说
  • [git]分支操作

    Checkout 相当于切换到该分支 但是因为不能直接操作远程分支 会在本地同步一个完全一样的分支 注意 切换分支前本地先进行提交 add commit 否则有可能代码会丢失 New Branch from Selected 创建一个新的分
  • 多态与多态对象模型

    这里简单介绍下什么是多态 多态的构成条件 多态原理以及多态的对象模型 在介绍多态之前 先简单的介绍下什么是虚函数 虚函数 类的成员函数前面加virtual关键字 则这个成员函数称为虚函数 注 1 除静态成员函数 2 内联函数不能定义为虚函数
  • NetworkManager is not running-liunx nmtui不可用

    NetworkManager 是CentOS 7 下的网络配置工具 如果遇到提示NetworkManager is not running那么需要安装一下 之前在CentOS 6下编辑网卡 直接使用setup工具就可以了 但在新版的Cent
  • error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token

    学会C语言也挺长时间了 当时写的时候就记得经常出现这个错误 在网络上查找感觉原因也林林总总 有时候也挺头疼的 就想着在这里记录一下原因 从字面上看是语法上的错误 缺少一些必要的符号 2019 4 26 在文件中找了很久 没有找到语法错误 后
  • storm七之storm java示例

    通过前面6个章节 我们大致了解apache storm的核心细节了 现在我们开始写一些简单的代码 来感受下storm的魅力 场景 移动呼叫日志分析 移动电话呼叫号及其持续时间将作为Apache stormd的输入流 storm将根据拨号方和
  • ARM(IMX6U)裸机之I.MX6ULL硬件启动方式的选择

    参考 Linux之ARM IMX6U 裸机之I MX6ULL启动方式详解 作者 一只青木呀 发布时间 2020 08 09 16 32 07 网址 https blog csdn net weixin 45309916 article de
  • qemu-system-x86_64方式创建KVM虚拟机

    一 QEMU介绍 QEMU是一款高效而实用的模拟器及虚拟机监管器 Virtual Machine Monitor VMM 主要提供两种功能给用户使用 一是作为用户态模拟器 利用动态代码翻译机制来执行不同于主机架构的代码 二是作为虚拟机监管器
  • CentOS 7 virt-install 命令行方式(非图形界面)安装KVM虚拟机

    环境及网卡配置请参考 https blog csdn net mshxuyi article details 98305715 创建镜像目录 mkdir p home vms virt install 配置文件 virt install n
  • Jenkins+allure执行unittest用例并生成allure报告(史上最全)

    对于allure报告的生成已经不是很新鲜的事情了 今天根据题目给大家做一个详细的配置过程说明一下 不管你的项目是pytest还是unittest都可以使用这种方式实现allure结果的产出 但是你的case一定要遵循框架的规则才可以 废话少
  • 【多区域电力系统模型】三区域电力系统的LQR和模糊逻辑控制(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 多区域电力系统模型是用来描述由多个区域组成
  • 群晖传文件到服务器,文件上传到群晖服务器

    文件上传到群晖服务器 内容精选 换一换 监控数据上报功能可以将系统中采集到的监控数据写入到文本文件 并以FTP或SFTP的形式上传到指定的服务器中 使用该功能前 管理员需要在FusionInsight Manager页面进行相关配置 监控数
  • 第十八章 多线程处理

    1 多线程基础 1 1 基本概念 进程 进程是操作系统中的一个基本概念 进程包含了一个程序运行所需的资源 一个进程包含多个线程 线程 线程是进程的基本执行单元 进程入口执行的第一个进程称为主线程 任务 任务是一个工作单元 目的是生成结果值