线程状态(转)
转自:http://www.cnblogs.com/Echang/archive/2008/07/15/1243232.html
先了解一下c# 所有运算符号的内容
表达式中的运算符按照称为运算符优先级的特定顺序计算。下表根据运算符执行的操作类型将它们划分到不同的类别中。类别按优先级顺序列出。
基本 |
x.y、f(x)、a[x]、x++、x--、new、typeof、checked、unchecked |
一元 |
+、-、!、~、++x、--x、(T)x |
算术 -- 乘法 |
*, /, % |
算术 -- 加法 |
+, - |
移位 |
<<, >> |
关系和类型检测 |
<, >, <=, >=, is, as |
相等 |
==, != |
逻辑(按优先级顺序) |
&, ^, | |
条件(按优先级顺序) |
&&, ||, ?: |
赋值 |
=, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= |
当表达式中出现两个具有相同优先级的运算符时,它们根据结合性进行计算。左结合运算符按从左到右的顺序计算。例如,x * y / z 计算为 (x * y) / z。右结合运算符按从右到左的顺序计算。赋值运算符和三元运算符 (?:) 是右结合运算符。其他所有二元运算符都是左结合运算符。然而,C# 标准没有指定何时执行表达式中的增量指令的“设置”部分。
线程状态
System.Threading.ThreadState枚举指定Thread的执行状态,此枚举有一个FlagsAttribute属性,允许其成员值按位组合。ThreadState定义的枚举常数如表19-3所示。
表19-3 ThreadState定义的枚举常数
成员名称 |
说 明 |
Aborted |
线程处于Stopped状态中 |
AbortRequested |
已对线程调用了Thread.Abort方法,但线程尚未收到试图终止它的挂起的System.Threading. ThreadAbortException |
Background |
线程正作为后台线程执行(相对于前台线程而言)。此状态可以通过设置Thread.IsBackground属性来控制 |
Running |
线程已启动,它未被阻塞,并且没有挂起的ThreadAbortException |
Stopped |
线程已停止 |
StopRequested |
正在请求线程停止。这仅用于内部 |
Suspended |
线程已挂起 |
SuspendRequested |
正在请求线程挂起 |
Unstarted |
尚未对线程调用Thread.Start方法 |
WaitSleepJoin |
由于调用Wait、Sleep或Join,线程已被阻止 |
Thread对象的ThreadState属性提供一个由ThreadState定义的位掩码,它指示线程的当前状态。一个线程至少总是处于ThreadState枚举中定义的一个可能状态,并且可以同时处于多个状态。
注意,只能在一些调试方案中使用线程状态,而不应该在代码中使用线程状态来同步线程活动。
在创建托管线程时,该线程处于Unstarted状 态。线程会保持Unstarted状态,直到被操作系统调度到已启动状态。调用Start方法使操作系统知道该线程可启动,但是它并不直接更改线程的状 态。一旦线程处于已启动的状态中,就可以执行许多操作来使线程更改状态。表19-4列出了使状态发生更改的操作,以及相应的新状态。
表19-4 使线程状态发生更改的操作及相应的新状态
操 作 |
ThreadState |
在公共语言运行库中创建线程 |
Unstarted |
线程调用Start |
Unstarted |
线程开始运行 |
Running |
续表
操 作 |
ThreadState |
线程调用Sleep |
WaitSleepJoin |
线程对其他对象调用Wait |
WaitSleepJoin |
线程对其他线程调用Join |
WaitSleepJoin |
另一个线程调用Interrupt |
Running |
另一个线程调用Suspend |
SuspendRequested |
线程响应Suspend请求 |
Suspended |
另一个线程调用Resume |
Running |
另一个线程调用Abort |
AbortRequested |
线程响应Abort请求 |
Stopped |
线程被终止 |
Stopped |
判断线程状态需要根据状态进行逻辑运算 如
if (m_MailThread.ThreadState & (System.Threading.ThreadState.WaitSleepJoin | System.Threading.ThreadState.Background | System.Threading.ThreadState.Running)) == m_MailThread.ThreadState)
{
//线程正在执行
}
与结果进行与运算 如果跟原先的结果没有变化的,则为判断条件成立
因为 1&1 =1; 结果是不变的才对.