在创建托管线程时,该线程处于 Unstarted 状态中。线程将始终保持在 Unstarted 状态中,直到通过调用 Thread.Start 将其移动到已启动状态。进入托管环境的非托管线程已经处于已启动状态中。一旦处于已启动状态中,就可以执行许多操作来使线程更改状态。下表列出使状态发生更改的操作以及相应的新状态。
操作 所得到的新状态
另一个线程调用 Thread.Start。 Unchanged
线程响应 Thread.Start 并开始运行。Running
线程调用 Thread.Sleep。 WaitSleepJoin
线程对另一个对象调用 Monitor.Wait。 WaitSleepJoin
线程对另一个线程调用 Thread.Join。WaitSleepJoin
另一个线程调用 Thread.Suspend。SuspendRequested
线程响应 Thread.Suspend 请求。 Suspended
另一个线程调用 Thread.Resume。Running
另一个线程调用 Thread.Interrupt。 Running
另一个线程调用 Thread.Abort。 AbortRequested
线程响应 Thread.Abort。 Aborted
由于 Running 状态的值为 0,因此不可能执行位测试来发现该状态。但可以使用以下测试(以伪代码表示)。
if ((state &(Unstarted | Stopped)) == 0) // implies Running
在任何给定时间,线程通常处于多个状态中。例如,如果某个线程在 Wait 调用阻塞并且另一个线程对该同一线程调用 Abort,则该线程将同时处于 WaitSleepJoin 和 AbortRequested 状态中。在这种情况下,一旦该线程从对 Wait 的调用返回或被中断,则它将收到 ThreadAbortException。
一旦线程由于调用 Thread.Start 而离开 Unstarted 状态,则它将永远无法返回到 Unstarted 状态。同样,线程也永远无法离开 Stopped 状态。
前台线程和后台线程的区别和联系:1、后台线程不会阻止进程的终止。属于某个进程的所有前台线程都终止后,该进程就会被终止。所有剩余的后台线程都会停止且不会完成。
2、可以在任何时候将前台线程修改为后台线程,方式是设置Thread.IsBackground 属性。
3、不管是前台线程还是后台线程,如果线程内出现了异常,都会导致进程的终止。
4、托管线程池中的线程都是后台线程,使用new Thread方式创建的线程默认都是前台线程。
说明:
应用程序的主线程以及使用Thread构造的线程都默认为前台线程
通过BeginXXX方法运行的线程都是后台线程。
线程池线程也就是使用 ThreadPool.QueueUserWorkItem()和Task工厂创建的线程都默认为后台线程
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)