托管线程状态
更新:2011 年 5 月
Thread.ThreadState 属性提供一个位掩码,用以指示线程的当前状态。 一个线程至少总是处于 ThreadState 枚举中的一个可能状态,并且可以同时处于多个状态。
重要事项 |
---|
只有在一些调试方案中才会涉及线程状态。始终不应在代码中使用线程状态来同步线程活动。 |
在创建托管线程时,该线程处于 ThreadState.Unstarted 状态。 在您调用 Thread.Start 方法前,该线程保持 Unstarted 状态,而调用该方法会将线程转为 Running 状态,以便操作系统可以计划其执行。
进入托管环境的非托管线程已启动。 线程启动后,许多操作都可使线程更改状态。 下表列出使状态发生更改的操作以及相应的新状态。
操作 |
所得到的新状态 |
---|---|
调用 Thread 类的构造函数。 |
|
另一个线程对新线程调用 Thread.Start 方法,并且该调用返回。 |
|
线程调用 Thread.Sleep。 |
|
线程对另一个对象调用 Monitor.Wait。 |
|
线程对另一个线程调用 Thread.Join。 |
|
另一个线程调用 Thread.Suspend。 |
|
线程响应 Thread.Suspend 请求。 |
|
另一个线程调用 Thread.Resume。 |
|
另一个线程调用 Thread.Abort。 |
|
线程响应 Thread.Abort。 |
由于 Running 状态的值为 0,因此无法执行位测试来发现此状态。 但可以使用以下测试(以伪代码表示)。
if ((state & (Unstarted | Stopped)) == 0) // implies Running
在任何给定时间,线程通常处于多个状态中。 例如,如果某个线程在 Monitor.Wait 调用被阻止,并且另一个线程对同一个线程调用 Abort,则该线程将同时处于 WaitSleepJoin 和 AbortRequested 状态。 在这种情况下,一旦该线程从对 Wait 的调用返回或该线程中断,它就会收到 ThreadAbortException。
一旦线程由于调用 Start 而离开 Unstarted 状态,那么它将无法再返回到 Unstarted 状态。 同样,线程也永远无法离开 Stopped 状态。
请参见
参考
其他资源
修订记录
日期 |
修订记录 |
原因 |
---|---|---|
2011 年 5 月 |
进一步阐明 Thread.Start 方法和 Running 状态之间的关系。 |
客户反馈 |
2011 年 3 月 |
阐明了 Thread.Start 方法和 Running 状态之间的关系。 |
内容 Bug 修复 |