天天看点

c#中线程的状态 黑马程序员 -- 多线程

转自:http://www.cnblogs.com/Echang/archive/2008/07/15/1243232.html

http://www.cnblogs.com/jinzhao/archive/2008/08/02/1258880.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; 结果是不变的才对. 作者: KKcat      出处: http://jinzhao.cnblogs.com/

黑马程序员 -- 多线程

http://software.intel.com/zh-cn/blogs/2012/06/15/400010577/?cid=sw:prccsdn2280