线程的基本状态以及状态之间的关系?
发布网友
发布时间:2022-05-07 07:13
我来回答
共1个回答
热心网友
时间:2023-10-20 12:04
Thread.ThreadState 属性提供一个位掩码,用它指示线程的当前状态。一个线程至少总是处于 ThreadState 枚举中一个可能状态,并且可以同时处于多个状态。
在创建托管线程时,该线程处于 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 状态。
参考资料:msdn NET Framework 开发员指南
热心网友
时间:2023-10-20 12:04
Thread.ThreadState 属性提供一个位掩码,用它指示线程的当前状态。一个线程至少总是处于 ThreadState 枚举中一个可能状态,并且可以同时处于多个状态。
在创建托管线程时,该线程处于 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 状态。
参考资料:msdn NET Framework 开发员指南
热心网友
时间:2023-10-20 12:04
Thread.ThreadState 属性提供一个位掩码,用它指示线程的当前状态。一个线程至少总是处于 ThreadState 枚举中一个可能状态,并且可以同时处于多个状态。
在创建托管线程时,该线程处于 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 状态。
参考资料:msdn NET Framework 开发员指南