【.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,InterlockedAutoResetEvent等)外,该命名空间还包含一个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()这两个方法已过时,需要使用AutoResetEventEventWaitHandle代替。

五、中止线程(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:获取一个值,该值包含当前线程的状态。

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

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

相关文章

使用 Python 第三方库 xlwt 写入数据到 Excel 工作表

1. 安装 xlwt 库 Python 写入数据到 Excel 工作簿中可以使用第三方库 xlwt. xlwt 拆分下来看就是 excel 和 write 的简化拼接&#xff0c;意思就是写数据到 Excel. 这个第三方库的 pip 安装命令如下所示&#xff1a; pip install xlwt -i https://mirrors.aliyun.com/pypi/si…

FairGuard游戏安全2023年度报告

导 读&#xff1a;2023年&#xff0c;游戏行业摆脱了疫情带来诸多负面影响&#xff0c;国内游戏市场收入与用户规模双双实现突破&#xff0c;迎来了历史新高点。但游戏黑灰产规模也在迅速扩大&#xff0c;不少游戏饱受其侵扰&#xff0c;游戏厂商愈发重视游戏安全问题。 为帮助…

WordPress怎么禁用文章和页面古腾堡块编辑器?如何恢复经典小工具?

现在下载WordPress最新版来搭建网站&#xff0c;默认的文章和页面编辑器&#xff0c;以及小工具都是使用古腾堡编辑器&#xff08;Gutenberg块编辑器&#xff09;。虽然有很多站长说这个编辑器很好用&#xff0c;但是仍然有很多站长用不习惯&#xff0c;觉得操作太难了&#xf…

C/C++ BM5 合并K个已排序的链表

文章目录 前言题目1 解决方案一1.1 思路阐述1.2 源码 2 解决方案二2.1 思路阐述2.2 源码 总结 前言 在接触了BM4的两个链表合并的情况&#xff0c;对于k个已排序列表&#xff0c;其实可以用合并的方法来看待问题。 这里第一种方法就是借用BM4的操作&#xff0c;只不过是多个合…

怎么处理vue项目中的错误详解

文章目录 一、错误类型二、如何处理后端接口错误代码逻辑问题全局设置错误处理生命周期钩子 三、源码分析小结参考文献 一、错误类型 任何一个框架&#xff0c;对于错误的处理都是一种必备的能力 在 Vue 中&#xff0c;则是定义了一套对应的错误处理规则给到使用者&#xff0…

【MATLAB源码-第117期】基于matlab的蜘蛛猴优化算法(SMO)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 蜘蛛猴优化算法&#xff08;Spider Monkey Optimization, SMO&#xff09;是一种灵感来源于蜘蛛猴觅食行为的群体智能优化算法。蜘蛛猴是一种生活在南美洲热带雨林中的灵长类动物&#xff0c;它们在寻找食物时展现出的社会行…

深入探究 JavaScript 中的 String:常用方法和属性全解析(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

比特币狂人引爆达沃斯论坛

点击查看TechubNews原文链接&#xff1a;比特币狂人引爆达沃斯论坛 比特币狂人、自称无政府资本主义者的阿根廷总统米莱在达沃斯的最新演讲引爆社交网络大讨论。 1 月 15 日&#xff0c;第 54 届世界经济论坛在瑞士阿尔卑斯山的达沃斯开幕。来自约 60 个国家首脑和跨国公司的领…

区域入侵检测AI边缘计算智能分析网关V4如何通过ssh进行服务器远程运维

智能分析网关V4是一款高性能、低功耗的AI边缘计算硬件设备&#xff0c;它采用了BM1684芯片&#xff0c;集成高性能8核ARM A53&#xff0c;主频高达2.3GHz&#xff0c;并且INT8峰值算力高达17.6Tops&#xff0c;FB32高精度算力达到2.2T&#xff0c;每个摄像头可同时配置3种算法&…

GIt与IDEA结合,多人操作gitee仓库

提交到本地 push到gitee远程仓库 在做这些之前注意配置git要忽略上传的文件,一般上传代码只上传src和pom.xml即可 在c盘用户里放置 git.ignore # Compiled class file *.class# Log file *.log# BlueJ files *.ctxt# Mobile Tools for Java (J2ME) .mtj.tmp/# Package Files …

算法刷题——拿出最少数目的魔法豆(力扣)

文章目录 题目描述我的解法思路结果分析 官方题解分析 查漏补缺更新日期参考来源 题目描述 传送门 拿出最少数目的魔法豆&#xff1a;给定一个正整数 数组beans &#xff0c;其中每个整数表示一个袋子里装的魔法豆的数目。请你从每个袋子中拿出 一些豆子&#xff08;也可以 拿…

Conmi的正确答案——使用eclipse进行ESP32C3的debug

eclipse IDE 版本:2023-12 1、安装debug环境 参考大神的教程:【图文】手把手教你使用 Eclipse IDE 开发 ESP32 (这里是为了我下次回来速通才写的部分) 1.1、安装插件(plug-in,新的软件已经写成software了): 相关软件参数: 汉化(安装完成会提示重启应用): Name:…

MPP架构和分布式架构的区别

前言&#xff1a;对大数据的数据处理需求&#xff0c;当前技术方向上存在两个不同的发展路线&#xff0c;MPP和分布式处理。两者数据处理的基本思路都是一样的&#xff0c;分布式并行处理再合并结果&#xff1b;但由于二者在处理架构上的差异&#xff0c;最终产品在应用需求性能…

openpose之使用摄像头检测并输出到json文件

编程如画&#xff0c;我是panda&#xff01; 前言 之前给大家分享了如何搭建openpose环境&#xff0c;并进行了测试案例&#xff0c;但是如果要使用摄像头的话&#xff0c;还需要修改一下运行文件&#xff0c;并且这次会教大家如何输出到json文件 。 如果环境还没有搭建好&am…

Linux CentOS stream9 nmcli

nmcli命令是redhat7或者centos7之后的命令&#xff0c;该命令可以完成网卡上所有的配置工作&#xff0c;并且可以写入配置文件&#xff0c;永久生效。 一、前期准备 在讨论、学习与训练nmcli命令前&#xff0c;必须明确几点&#xff1a; 1.开启NetworkManager 使用nmcli命令…

【计算机网络】(1)OSI七层模型、协议、交换技术、路由器技术

文章目录 计算机网络功能与分类计算机网络的定义计算机网络的功能计算机网络的指标计算机网络的性能指标计算机网络的非性能指标 计算机网络的分布范围以及拓扑结构划分图计算机网络分类总线型拓扑星型拓扑环形图拓扑树型拓扑分布式拓扑 通信技术信道物理信道逻辑信道 发信机OS…

目标检测--01

基本概念 什么是目标检测&#xff1f; ​ 目标检测&#xff08;Object Detection&#xff09;的任务是找出图像中所有感兴趣的目标&#xff08;物体&#xff09;&#xff0c;确定它们的类别和位置&#xff0c;是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状…

canvas绘制不同样式的六角星(示例源代码)

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

(2)(2.1) Andruav Android Cellular(一)

文章目录 前言 1 Andruav 是什么&#xff1f; 2 Andruav入门 3 Andruav FPV 4 Andruav GCS App​​​​​​​ 前言 Andruav 是一个基于安卓的互联系统&#xff0c;它将安卓手机作为公司计算机&#xff0c;为你的无人机和遥控车增添先进功能。 1 Andruav 是什么&#xff…

抽象类(没有对象)之引用对象失败之谜

&#x1f468;‍&#x1f4bb;作者简介&#xff1a;&#x1f468;&#x1f3fb;‍&#x1f393;告别&#xff0c;今天 &#x1f4d4;高质量专栏 &#xff1a;☕java趣味之旅 欢迎&#x1f64f;点赞&#x1f5e3;️评论&#x1f4e5;收藏&#x1f493;关注 &#x1f496;衷心的希…