【.NET Core】 多线程之(Thread)详解
【.NET Core】 多线程之(Thread)详解
文章目录
- 【.NET Core】 多线程之(Thread)详解
- 一、概述
- 二、线程的创建和使用
- 2.1 ThreadStart用于无返回值,无参数的方法
- 2.2 ParameterizedThreadStart:用于带参数的方法
- 三、线程的启动执行
- 四、线程的挂起和恢复
- 4.1 Suspend方法
- 4.2 Resume方法
- 4.3 该方法已废弃及替代方法
- 五、中止线程(About)
- 六、线程休眠(Sleep)
- 七、线程等待(Join())
- 八、线程让步(Yield())
- 九、后台线程与前台线程
- 十、`Thread`线程属性

一、概述
线程
被定义为程序的执行路径。每个线程都定义了一个独特的控制流。如果您的应用程序涉及复杂且耗时的操作,那么设置不同的线程执行路径往往事半功倍,让每个线程执行特定的工作任务。
线程是一个轻量级进程
。一个使用线程的常见实例是操作系统中并行编程的实现。使用线程节省了CPU周期的浪费,同时提高了应用程序的效率。本文将讲详细讲解Thread
线程的用法。
Thread
类位于System.Threading
命名空间下,System.Threading
命名空间提供一些可以进行多线程编程的类和接口。除同步线程活动和访问数据的类(Mutex
,Monitor
,Interlocked
和AutoResetEvent
等)外,该命名空间还包含一个ThreadPool
类(它允许用户使用系统提供的线程池)和一个Timer
类(它在线程池的线程上执行回调方法)。
二、线程的创建和使用
Thread
创建一个线程非常简单,只需要将其声明并为其提供线程起始点处的委托即可。创建新的线程时,需要使用Thread
类,该类具有接受一个ThreadStart
委托或ParameterizedThreadStart
委托的构造函数。
2.1 ThreadStart用于无返回值,无参数的方法
public static void Main(string[] args)
{ThreadStart threadStart = new ThreadStart(MyThread);Console.WriteLine("创建一个线程");Thread thread= new Thread(threadStart);thread.Start();
}private static void MyThread()
{Console.WriteLine("This is Thread Method.");Thread.Sleep(2000);Console.WriteLine("Thread is over.....");
}
运行结果:
创建一个线程
This is Thread Method.
Thread is over.....
2.2 ParameterizedThreadStart:用于带参数的方法
public static void Main(string[] args)
{ParameterizedThreadStart threadStart = new ParameterizedThreadStart(MyThread);Console.WriteLine("创建一个线程");Thread thread= new Thread(threadStart);thread.Start(100);
}private static void MyThread(object n)
{Console.WriteLine("This is Thread Method.");Thread.Sleep(2000);Console.WriteLine("Thread is over.....");for (int i = 0; i <= (int)n; i += 1){Console.WriteLine(i);}
}
三、线程的启动执行
线程创建后并不会理解执行,这是因为绝大多数系统不是一个实时的操作系统。在操作系统内部会实现特殊的算法进行线程之间的调度。在某个时刻它会决定当前运行哪个线程。看下面的示例:
static int id = 0;
public static void Main(string[] args)
{for (int i = 0; i < 10; i++){id++;Thread thread = new Thread(() =>{Console.WriteLine(string.Format("{0}:{1}", Thread.CurrentThread.Name, id));});thread.Name = string.Format("Thread{0}", i);thread.IsBackground = true;thread.Start();}
}
执行结果:
Thread1:3
Thread0:3
Thread2:4
Thread3:5
Thread4:6
Thread5:7
Thread6:8
Thread7:9
Thread8:10
Thread9:10
使用同步参数创建线程
static int id = 0;
static void Main(string[] args)
{for (int i = 0; i < 5; i++, id++){NewMethod(i, id);}Console.ReadLine();
}
private static void NewMethod(int i, int realTimeId)
{Thread thread = new Thread(() =>{Console.WriteLine(string.Format("{0}:{1}", Thread.CurrentThread.Name, realTimeId));});thread.Name = string.Format("Thread{0}", i);thread.IsBackground = true;thread.Start();
}
运行结果:
Thread0:0
Thread1:1
Thread2:2
Thread3:3
Thread4:4
四、线程的挂起和恢复
创建完一个线程并启动后,还可以挂起、恢复、休眠或终止线程。线程的挂起与恢复可以通过调用Thread
类的Suspend
方法和Resume
方法实现。
4.1 Suspend方法
该方法用来挂起线程,如果线程已挂起,则不起作用。调用Suspend
方法挂起线程时,.NET允许挂起的线程再执行几个指令,目的是为了到达.NET认为线程可以安全挂起的状态。
4.2 Resume方法
该方法用来继续已挂起的线程。通过Resume
方法来恢复被暂停的线程时,无论调用多少次Suspend
方法,调用Resume
方法均会使另一个线程脱落挂起状态。
通过Resume()
方法来恢复被暂停的线程时,无论调用了多少次Suspend()
方法,调用Resume()
方法均会使另一个线程脱离挂起状态,并导致该线程继续执行。
4.3 该方法已废弃及替代方法
Thread.Suspend()
和Thread.Resume()
这两个方法已过时,需要使用AutoResetEvent
、EventWaitHandle
代替。
五、中止线程(About)
线程被中止,就停止运行,是无法恢复的,因为操作系统会删除被中止线程所有数据。
static void Main(string[] args)
{Thread myThread; myThread = new Thread(new ThreadStart(createThread));myThread.Start();myThread.Abort();
}
private static void createThread()
{for (long i = 0; i < 1000000000; i++){ Console.WriteLine($"workThread-->i={i}");}
}
线程中止和线程挂起是一样结果,中止工作线程后,线程将不会在被执行,如果强制运行程序,将出现运行时错误。
六、线程休眠(Sleep)
使线程休眠使用Sleep()
方法,此方法可以让线程休眠一定的时间,示例代码如下:
Thread workThread = new Thread(new ThreadStart(createThread));
workThread.Start();
Thread.Sleep(10000);//修改
Sleep()
会让线程暂停一段时间后接着运行,休眠线程不需要手动恢复,到指定的时间后会自动执行。
七、线程等待(Join())
如果后续的处理依赖于另一个已终止的线程,可调用Join()
方法,等待线程中止。
Thread workThread = new Thread(new ThreadStart(createThread));
workThread.Start();
workThread.Join();
工作线程调用了Jion()
方法,需待工作线程中止后,主线程才会被执行。Jion()
的其他重载方法可以指定等待的时间期限,超过了时间期限,程序会继续执行。
八、线程让步(Yield())
Yield 的中文翻译为 “屈服,让步”,这里意思是主动放弃当前线程的时间片,并让操作系统调度其它就绪态的线程使用一个时间片。但是如果调用 Yield,只是把当前线程放入到就绪队列中,而不是阻塞队列。如果没有找到其它就绪态的线程,则当前线程继续运行。Yield可以让低于当前优先级的线程得以运行,调用者可以通过返回值判断是否成功调度了其它线程。注意,Yield只能调度运行在当前CPU上的线程。
九、后台线程与前台线程
线程是后台线程或前台线程。后台线程与前台线程相同,只不过后台线程不会阻止进程终止。一旦属于进程的所有前台线程都终止,公共语言进行时将结束该进程。所有剩余的后台线程将停止,并且无法完成。
默认情况下,以下线程是前台线程:
- 主线程(或主应用程序线程)。
- 通过调用类构造函数创建
Thread
的所有线程都是前台线程。
默认情况下,以下线程在后台执行:
- 线程池线程,由运行时维护的工作线程池。可以使用类配置线程池并计划线程池线程
ThreadPool
上工作。 - 从非托管代码进入托管执行环境的所有线程。
十、Thread
线程属性
CurrentThread
:获取当前正在运行的线程。IsAlive
:获取指示当前线程的执行状态的值。IsBackgroud
:获取或设置一个值,该值指示某个线程是否为后台线程。IsThreadPoolThread
:获取指示线是否属于托管线程池的值。Name
:获取或设置线程的名称。Priority
:获取或设置线程调度优先级的值。ThreadState
:获取一个值,该值包含当前线程的状态。
相关文章:

【.NET Core】 多线程之(Thread)详解
【.NET Core】 多线程之(Thread)详解 文章目录 【.NET Core】 多线程之(Thread)详解一、概述二、线程的创建和使用2.1 ThreadStart用于无返回值,无参数的方法2.2 ParameterizedThreadStart:用于带参数的方法 三、线程的…...

苹果笔记本 macbook 在 office word 中使用 mathtype 的方法
前言 想在 MacBook 中使用 mathtype,去搜索,去 Apple Store 下载也发现没有 解决方法 打开 office Word 的「插入」中的「获取加载项」、「我的加载项」。 在应用商店中下载,需要登录自己的微软账号。 加载成功后就可以使用了。 注意 和…...

课表排课小程序怎么制作?多少钱?
在当今的数字化时代,无论是购物、支付、点餐,还是工作、学习,都离不开各种各样的微信小程序。其中,课表排课小程序就是许多教育机构和学校必不可少的工具。那么课表排课小程序怎么制作呢?又需要多少钱呢? …...

C语言总结十三:程序环境和预处理详细总结
了解程序的运行环境可以让我们更加清楚的程序的底层运行的每一个步骤和过程,做到心中有数,预处理阶段是在预编译阶段完成,掌握常用的预处理命令语法,可以让我们正确的使用预处理命令,从而提高代码的开发能力和阅读别人…...

tinyxml2
使用tinyxml2,得知道一些xml基础 xml tutorial--菜鸟 tinyxml2类对象 链接 结构 XMLNode 什么是节点 节点:元素、声明、文本、注释等。 XMLDocument xml文档(文件)对象。 作用: 加载xml文件, tinyxml2作用 先定义两个宏 …...

What is `@Controller` does?
Controller 是SpringMVC注解,标记一个类作为Web控制器(Controller),负责处理HTTP请求并返回响应结果 在SpringMVC中,控制器类的主要职责是: 1、接收来自客户端的HTTP请求 2、调用服务层或其他业务逻辑组件…...

新版AndroidStudio dependencyResolutionManagement出错
在新版AndroidStudio中想像使用4.2版本或者4.3版本的AndroidStudio来构造项目?那下面这些坑我们就需要来避免了,否则会出各种各样的问题。 一.我们先来看看新旧两个版本的不同。 1.jdk版本的不同 新版默认是jdk17 旧版默认是jdk8 所以在新版AndroidSt…...

第三天业务题
3-1 你们的项目是如何进行参数校验的 在我们的项目中,通常使用以下2种方式进行参数校验: 1.手动校验:在方法内部,我们可以手动编写代码来对参数进行校验。例如,使用条件判断语句(if-else)来检…...

nestjs 装饰器
1、装饰器定义 装饰器是一种特殊的类型声明,它可以附加在类、方法、属性、参数上边 需开启tsconfig.json中 "experimentalDecorators":true 生成tsconfig.json文件 tsc -init 2、类装饰器 // 类装饰器 主要是通过符号添加装饰器 // 装饰器会自动把cl…...

一款开源且不限制大小可以设置过期时间的支持分享的的开源文件共享系统picoshare 部署教程
1.拉取镜像 2.部署 创建目录 mkdir -p /opt/picoshare/data 部署 其中:"somesecretpass"是密码 docker run \--env "PORT4001" \--env "PS_SHARED_SECRETsomesecretpass" \--publish 10005:4001/tcp \--volume "/opt/picoshare/data:…...

eBPF运行时安全
引言 eBPF作为当前linux系统上最为炙手可热的技术,通常被用于网络流量过滤和分析、系统调用跟踪、性能优化、安全监控,当下比较知名的项目有Cilium、Falco等。 Cilium 是一个开源的容器网络和安全性项目,致力于提供高效的容器通信和强大的安…...

Linux 系统中常见的命令,它们用于执行各种任务,包括文件和目录管理、系统信息查看、用户管理等
以下是一些在 Linux 系统中常见的命令,它们用于执行各种任务,包括文件和目录管理、系统信息查看、用户管理等。这里列举了一些基础的命令: 文件和目录管理: ls: 列出目录内容。 ls cd: 切换当前目录。 cd /path/to/directory …...

AutoEventWireup详解
AutoEventWireup详解 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,让我们深入探讨.NET开发中一个神奇而强大的特性——AutoEventWireupÿ…...

SAP ABAP 自定义流水号 编号范围
前言 在开发中经常会遇到生成编号的需求(如接口报文ID,自建表数据主键等);为此,SAP提供了自动编号工具,能根用户需求设定并自动生成一组唯一的编号。 编号范围对象的创建 1.进入事务代码SNRO,创建一个编号范围对象。…...

安卓、ios系统详解
一、安卓 安卓系统架构:从上至下,依次是应用层、应用框架层、系统运行库层和Linux内核层 应用层(system app):系统内置的应用程序及非系统级的应用程序都属于应用层,负责与用于进行交互,一般都用java或者kotlin来开发应用框架层(java api framework):为应用层提供所需…...

含并行连结的网络(GoogLeNet)
目录 1.GoogLeNet 2.代码 1.GoogLeNet inception不改变高宽,只改变通道数。GoogLeNet也大量使用1*1卷积,把它当作全连接用。 V3耗内存比较多,计算比较慢,但是精度比较准确。 2.代码 import torch from torch import nn from t…...

计算机网络(第六版)复习提纲3
2.3 物理层下面的传输媒体 传输媒体是数据传输系统中在发送器和接收器之间的物理通道,有导引型传输媒体(有线)和非导引型传输媒体(无线) 1.双绞线:两条铜线绞合,以减少干扰,绞合度越…...

怿星科技测试实验室获CNAS实验室认可,汽车以太网检测能力达国际标准
2023年12月27日,上海怿星电子科技有限公司测试实验室(下称:EPT LABS)通过CNAS实验室认可批准,并于2024年1月5日正式取得CNAS实验室认可证书(注册号CNAS L19826),标志着怿星科技的实验…...

GORM 介绍及快速入门
GORM 介绍及快速入门 前言 GORM 是一个用 GoLang 语言编写的 ORM(对象关系映射)库。它被设计为开发者友好的方式来进行数据库操作。GORM 提供了一种高级的 API 来处理数据库的 CRUD(创建、读取、更新、删除)操作,它支…...

Scrcpy:掌握你的Android设备
Scrcpy:掌握你的Android设备 本文将介绍Scrcpy工具,它是一种强大的安卓设备控制工具,可以实现屏幕镜像、操作控制等功能。我们将探讨Scrcpy的基本原理和工作方式,并介绍如何使用Scrcpy连接和控制安卓设备。此外,我们还…...

[9, 8, 7, 6][1,2] = ?
当我们运行这段代码时,控制台中会记录什么值? const arr [9, 8, 7, 6]; const res arr[1, 2]; console.log(res);当我们运行这段代码时,res 的值将是 7。并且控制台中会打印出 7。 让我们来详细分析一下。 第一步:[1, 2] 会被转换成 [2]。 为什么? 后续的元素 [1, 2] …...

docker部署Jira+配置MySQL8数据库
写在前面:如果你通过docker安装Jira且启动过,然后你现在又想使用mysql数据库,需要注意 你除了停掉原有容器,还需要删除:/var/lib/docker/volumes/jiraVolume/_data下的文件,否则启动后会无法正常使用。注意…...

YOLOv5全网独家首发:DCNv4更快收敛、更高速度、更高性能,效果秒杀DCNv3、DCNv2等 ,助力检测实现暴力涨点
💡💡💡本文独家改进:DCNv4更快收敛、更高速度、更高性能,完美和YOLOv5结合,助力涨点 DCNv4优势:(1) 去除空间聚合中的softmax归一化,以增强其动态性和表达能力;(2) 优化存储器访问以最小化冗余操作以加速。这些改进显著加快了收敛速度,并大幅提高了处理速度,DCN…...

HTML中常用标签--详解
目录 1.b/strong标签 2.i/em 标签 3.u标签 4.del删除线 5.br换行 6.p标签 * 7.pre 预处理标签 8.span标签** 9.div标签*** 10.sub标签 11.sup标签 12.hr标签 13.hn标签 14.HTML5中语义标签 特殊字符 15.多媒体标签 img*** a 标签*** 第一种用法:…...

Vue实现字符串首字母大写、翻转字符串、获取用户选定的文本
目录 Vue2实现字符串首字母大写Vue3实现字符串首字母大写Vue2实现翻转字符串Vue3实现翻转字符串Vue2获取用户选定的文本Vue3获取用户选定的文本 Vue2实现字符串首字母大写 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"…...

基于springboot+vue的旅游网站系统(前后端分离)
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…...

GB/T28181-2022之图像抓拍规范解读和设计实现
技术背景 GB/T28181-2022相对2016版,对图像抓拍有了明确的界定,图像抓拍在视频监控行业非常重要, Android平台GB28181设备接入端,无需实时上传音视频实时数据的情况下,就可以抓图上传到指定的图像存储服务器上。 图像抓拍基本要…...

阿赵UE学习笔记——10、Blender材质和绘制网格体
阿赵UE学习笔记目录 大家好,我是阿赵。 之前介绍了虚幻引擎的材质和材质实例。这次来介绍一个比较有趣的内置的Blender材质。 在用Unity的时候,我做过一个多通道混合地表贴图的效果,而要做过一个刷顶点颜色混合地表和水面的效果。…...

数据结构--串
本文为复习的草稿笔记,,,有点乱 1. 串的基本概念和基本操作 串是由零个或多个字符组成的有限序列 2. 串的存储结构 3.串的应用 模式匹配 BF算法(简单匹配算法 穷举法 算法思路:从子串的每一个字符开始依次与主串…...

RabbitMQ交换机(3)-Topic
1.Topic模式 RabbitMQ的Topic模式是一种基于主题的消息传递模式。它允许发送者向一个特定的主题(topic)发布消息,同时,订阅者也可以针对自己感兴趣的主题进行订阅。 在Topic模式中, 主题通过一个由单词和点号组成的字…...