再说多线程(六)——Thread生命周期

news2024/11/28 18:54:34

前面一直在用Thread介绍多线程任务,本节对线程类Thread的生命周期进行简单的梳理。

  1. 线程状态

对于一个线程来说,有以下几种状态:

  1. Unstarted(New) State

  1. Runnable State(Ready to Run)

  1. Running State

  1. Not Runable State

  1. Dead State

这几种状态的转换关系图如下:

下面结合上图简要介绍:

  1. UnStarted State,为启动状态,顾名思义,就是只是创建了一个线程类对象,但是还未启动。也就是在你使用:

Thread thread=new Thread(DoSomeMethod)

之后,线程的状态就是Unstarted状态。一旦线程离开这个状态,就再也无法回到此状态了。

  1. Rnunable State,可运行状态,当你调用Thread的Start方法后,就会立即进入Runnable状态,为啥不是运行状态呢?因为系统可能有多个线程在等待 运行,线程调度器会根据调度策略在合理的时间片段内运行此线程,线程在此状态时,查看IsAlive属性后就会变成True。显然,线程离开此状态后仍可以回到此线程,如线程进入Sleeping、Waiting或Blocking函数后。

  1. Running State。运行状态,当线程调度器将当前线程选中时,线程就会变成Running状态,对于CPU的一个内核,只能有一个线程正在运行。对于Running State,它可以进入Dead State、Not Runnable State和Runnable State。

  1. NotRunnable State,该状态不是一个自然状态,也就是Cpu时不会主动将其送到此状态的,一般遇到以下几种情况会进入此状态:

  • 当该线程调用Wait()函数后,他会一直等待,知道被其它线程唤醒

  • 调用Sleep函数,在经过指定时间后会进入Runnable State

  • 当Thread对象a在另一个线程b调用Join函数后,那么这个相乘对象a会一直等待线程b完成,如果a完成了,那么就不会等待,一般b代表主线程,所以主线程可以保证子线程先完成。

  • 当一个线程在等待输入输出端口时,也就是IO中断。

在此状态下,CPU不会主动运行线程,一般必须有外界处理后,才会重新进入Runnable状态,也是就说,一般线程同步就出现在此状态。

  1. Dead State 当线程完成任务后就会进入此状态,进入此状态后不能再次调用Start重新启动,否则会抛出异常。当然线程也可能运行失败,如调用Abort函数也会终止线程运行。

  1. 类成员

属性有:

  1. CurrentThread: 获取CPU当前运行的线程实力,在一个线程内调用就是获取自身

  1. IsAlive:线程时否活着,Bool值,前面也提到过,除了UnStarted 和Dead,IsAlive均为True

  1. Name:线程名,string字段,可在构造线程时赋值

  1. ThreadState:线程状态,也就是我们在前面提到的,返回System.Threading.ThreadState类型

成员函数有:

  1. Sleep():此方法将当前线程挂起指定的时间量。

  1. Join():此方法阻止调用线程,直到此实例表示的线程终止,同时继续执行标准 COM 和 SendMessage 抽取。

  1. Abort():此方法在调用它的线程中引发 System.Threading.ThreadAbortException,以开始终止线程的过程。调用此方法通常会终止线程。

  1. Suspend():此方法挂起线程,或者如果线程已挂起,则不起作用。

  1. Resume():此方法恢复已挂起的线程。

  1. Start(): 此方法会导致操作系统将当前实例的状态更改为正在运行状态。

  1. 示例代码

下面举个例子来说明:

try
{
    Thread t = new Thread(SomeMethod);
    Show(t, "Before Statrt");
    t.Start();
    Show(t, "After Start");
    t.Suspend();
    Show(t, "After Suspend");
    t.Resume();
    Show(t, "After Resume");
    t.Abort();
    Show(t, "After abort");
    t.Start();
}
catch (Exception e)
{
    Console.WriteLine($"Exception: {e.Message}");
}
Console.ReadKey();


static void SomeMethod()
{
    for (int x = 0; x < 3; x++)
    {
        Thread.Sleep(1000);
    }
    Console.WriteLine("SomeMethod Completed...");
}

static void Show(Thread t,string prefix)
{
    Console.WriteLine(prefix + $" IsAlive: {t.IsAlive},---Thread State: {t.ThreadState}");
}

要说明的是:上面的代码在Win11,inter i7-12500H cpu下运行会报错:

Before Statrt IsAlive: False,---Thread State: Unstarted
After Start IsAlive: True,---Thread State: Running
Exception: Thread suspend is not supported on this platform.
SomeMethod Completed...

提示Suspend函数在本平台下不支持,除了Start另外几个函数也不支持。在Vs中还会提示:

严重性    代码    说明    项目    文件    行    禁止显示状态
警告    CS0618    “Thread.Suspend()”已过时:“Thread.Suspend has been deprecated. Use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources.”    ThreadStudy    C:\Users\95644\Documents\algorithm-learning\ParallelPrograming\BlockingCollection\ThreadStudy\Program.cs    8    活动

也就是Suspend、Abort、Resume这三个函数微软已经不推荐使用,建议我们使用之前介绍的Monitor,Mutex、Event和Semaphore来同步线程。

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

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

相关文章

chatgpt国内能用的镜像与api请求样例

chatgpt去年刚出来时我就到openai注册了账号&#xff0c;必须用国外的线路才能注册&#xff0c;正常注册不了&#xff0c;注册完要用国外手机接收验证码&#xff0c;才能使用&#xff0c;我卡到验证码就没继续用了&#xff0c;昨晚&#xff0c;找了几个国内的镜像&#xff0c;用…

课程回顾|以智能之力,加速媒体生产全自动进程

本文内容整理自「智能媒体生产」系列课程第二讲&#xff1a;视频AI与智能生产制作&#xff0c;由阿里云智能视频云高级技术专家分享视频AI原理&#xff0c;AI辅助媒体生产&#xff0c;音视频智能化能力和底层原理&#xff0c;以及如何利用阿里云现有资源使用音视频AI能力。课程…

PyTorch学习笔记:nn.Sigmoid——Sigmoid激活函数

PyTorch学习笔记&#xff1a;nn.Sigmoid——Sigmoid激活函数 torch.nn.Sigmoid()功能&#xff1a;逐元素应用Sigmoid函数对数据进行激活&#xff0c;将元素归一化到区间(0,1)内 函数方程&#xff1a; Sigmoid(x)σ(x)11e−xSigmoid(x)\sigma(x)\frac1{1e^{-x}} Sigmoid(x)σ(…

基于python下selenium库实现交互式图片保存操作(批量保存浏览器中的图片)

Selenium是最广泛使用的开源Web UI&#xff08;用户界面&#xff09;自动化测试套件之一&#xff0c;可以通过编程与浏览量的交互式操作对网页进行自动化控制。基于这种操作进行数据保存操作&#xff0c;尤其是在图像数据的批量保存上占据优势。本博文基于selenium 与jupyterla…

Python基础01

Python基础 1、编程环境&#xff1a;IDLE 1.1使用 1、文件创建&#xff1a;File —> New File 2、文件打开&#xff1a;File —> Open 3、文件保存&#xff1a; File —> Save 2、输入输出 2.1输入&#xff1a;input() 语法&#xff1a;input(“想要表达的内容”…

在阿里当外包,是一种什么工作体验?

上周和在阿里做外包的朋友一起吃饭&#xff0c;朋友吃着吃着&#xff0c;就开启了吐槽模式。 他一边喝酒一边说&#xff0c;自己现在做着这份工作&#xff0c;实在看不到前途。 看他状态不佳&#xff0c;问了才知道&#xff0c;是手上的项目太磨人。 他们现在做的项目&#…

大数据---Hadoop安装Hadoop简易版

编写自动安装Hadoop的shell脚本 完整流程: 大数据—Hadoop安装教程&#xff08;二&#xff09; 文章目录编写自动安装Hadoop的shell脚本上传压缩包编写shell脚本vim hadoopautoinstall.sh运行上传压缩包 在opt目录下创建连个目录install和soft 将压缩包上传到install目录下 …

docker file和compose

文章目录1.dockerfile&#xff08;单机脚本&#xff09;1.概念2.原理3.dockerfile核心四步4.命令2.docker compose1.概念2.注意事项3.常用字段4.常用命令1.dockerfile&#xff08;单机脚本&#xff09; 1.概念 通过脚本&#xff0c;生成一个镜像&#xff0c;并运行对应的容器…

简介Servlet

目录 一、maven中心库 二、简介Servlet 三、实现Servlet动态页面 1、创建一个maven项目 2、引入依赖 3、创建目录结构 4、编写Servlet代码 5、打包 6、部署 7、验证程序 四、Servlet的运行原理 五、Tomcat伪代码 1、Tomcat初始化 a、让Tomcat先从指定的目录…

C语言学习_DAY_2_变量的定义_输入与输出

高质量博主&#xff0c;点个关注不迷路&#x1f338;&#x1f338;&#x1f338;&#xff01; 目录 I. 变量的定义 II. 变量的赋值 III. 输出 IV. 输入 I. 变量的定义 首先&#xff0c;我们新建一个.c文件在Dev C中&#xff0c;并把之前定义好的程序框架放进去。 此时我…

丝绸之路——NFT 系列来袭!

丝绸之路的经历讲述了汉朝时代的一个重要历史事件。该系列中的 NFT 带有中国这段黄金时代令人愉悦的视觉元素&#xff0c;使其成为值得收藏的物品。 NFT 系列介绍 敦煌女神像01&#xff08;左&#xff09;&#xff1b;汉代士兵&#xff08;中&#xff09;&#xff1b;敦煌女神像…

Matlab与ROS(1/2)链接与入门(一)

0. 简介 Matlab作为广大学生以及算法工程师常用的软件&#xff0c;因其良好的可视化以及矩阵适应能力&#xff0c;使其得到了广泛的使用。同时ROS作为机器人、自动驾驶领域最常用的软件&#xff0c;其与Matlab结合在一起也是理所当然的。为此这一系列就是来带领读者熟悉并了解…

说说连接查询有哪些以及它们之间的区别?

一、左连接 -- 左连接 select t1.a,t2.b from (select 1 a from DUAL union ALL select 1 a from DUAL union ALL select 2 a from DUAL union ALL select 2 a from DUAL union ALL select 3 a from DUAL)t1 LEFT JOIN (select 1 b from DUAL union ALL select 2 b from DUAL …

【成为架构师课程系列】大数据技术体系精华总结【值得收藏!】

目录 大数据技术总结 #大纲 #概念 #应用 #难题 #技术栈 #大数据架构 #1. 数据收集

git报错大全,你将要踩的坑我都帮你踩了系列

使用git push -u origin master报下面的错&#xff1a; 使用git push -u origin master报下面的错&#xff1a; Updates were rejected because the remote contains work that you do not have locally&#xff0c;This is usually caused by another repository pushing to …

kubernetes基础

文章目录1.k8s1.概念2.特性3.核心组件1.k8s 1.概念 用于自动部署、扩展和管理“容器化&#xff08;containerized&#xff09;应用程序”的开源系统。 可以理解成 K8S 是负责自动化运维管理多个容器化程序&#xff08;比如 Docker&#xff09;的集群&#xff0c;是一个生态极…

【刷题笔记】--验证二叉搜索树--min,max参与递归

题目&#xff1a; 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 示例…

【大唐杯备考】——5G基站开通与调测(学习笔记)

&#x1f4d6; 前言&#xff1a;本期介绍5G基站开通与调测。 目录&#x1f552; 1. 概述&#x1f552; 2. 5G基站开通与调测基础&#x1f558; 2.1 3.5GHz单模100MHz配置&#xff08;S111&#xff09;&#x1f558; 2.2 3.5GHz单模100MHz配置&#xff08;S111111&#xff09;&a…

车载以太网 - SomeIP - 杂项 - 09

SomeIP-SD Find Service Timing - 服务发现相关时间参数参数描述最小值标准值最大值T_Initial初始化时间0msNA1000msTTL生存时间NA5000msNAT_Cycle_Offer_Msg提供服务报文周期950ms1000ms1050msRepetition_Max最大重复次数NA3次NAInitial_dealy_Min初始化最小延迟NA90msNAIniti…

Spring、SpringMVC、Shiro、Maven

一、SpringSpring是一个为了解决企业应用程序开发复杂性而创建的开源框架&#xff0c;其核心是IOC–控制反转、AOP–面向切面编程。框架的主要优势之一就是其分层架构&#xff08;WEB层&#xff08;springMvc&#xff09;、业务层&#xff08;Ioc&#xff09;、持久层&#xff…