再说多线程(六)——Thread生命周期
创始人
2024-05-24 23:53:42
0

前面一直在用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来同步线程。

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...