C#多线程实践——线程状态

线程状态关系图

  在.NET Framework中,可以通过ThreadState属性获取线程的执行状态。上图标识出三种状态“层”,ThreadState以按位计算的方式组合状态层,每种状态层的成员之间都是互斥的,下面是所有的三种状态“层”:

  • 运行 (running) / 阻止 (blocking) / 终止 (aborting) 状态(上图显示)
  • 后台 (background) / 前台 (foreground) 状态 (ThreadState.Background)
  • 不建议使用的Suspend 方法(ThreadState.SuspendRequested 和 ThreadState.Suspended)挂起的过程

总的来说,ThreadState是按位组合零或每个状态层的成员!一个简单的ThreadState示例如下:

Unstarted

Running

WaitSleepJoin

Background, Unstarted

SuspendRequested, Background, WaitSleepJoin

这些枚举的成员中StopRequested 和 Aborted两个从来没被用过,至少当前CLR实现上每月使用过。

另外,ThreadState.Running潜在的值为0 ,因此代码不会被执行:

if ((t.ThreadState & ThreadState.Running) > 0) ...

  这种情况下,需要使用线程的IsAlive属性来代替按位与非操作符。不过IsAlive的结果可能不是想要的,因为线程在在被阻止或挂起的时候也会返回true(只有在线程未开始或已正常结束时它才为false)。

避开不推荐使用的Suspend 和 Resume方法,可以写一个helper方法除去所有除了第一种状态层的成员。线程的后台状态可以通过IsBackground 获得,所以实际上只有第一种状态层拥有有用的信息。

public static ThreadState SimpleThreadState (ThreadState ts)

{
    return ts & (ThreadState.Aborted | ThreadState.AbortRequested |
    ThreadState.Stopped | ThreadState.Unstarted |
    ThreadState.WaitSleepJoin);
}

  ThreadState对调试或程序概要分析很重要,不过在多线程协同的情况下就没这么方便了,因为没有一个可靠的机制可以不考虑ThreadState的变化而仅通过判断ThreadState来执行信息。

时间: 2024-11-04 07:30:29

C#多线程实践——线程状态的相关文章

Java多线程及线程状态转换

Java实现多线程的方法有两种,一是继承Thread类.二是实现Runnable接口. 一.继承Thread类 public class ThreadTest extends Thread { @Override public void run() { System.out.println("this thread name is:"+Thread.currentThread().getName()); } /** * @param args */ public static void

C#多线程实践——线程同步

下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程完成                       锁系统 构成 目的 跨进程? 速度 lock 确保只有一个线程访问某个资源或某段代码. 否 快 Mutex 确保只有一个线程访问某个资源或某段代码.可被用于防止一个程序的多个实例同时运行. 是 中等 Semaphore 确保不超过指定数目的线程访问某个资源或某段代

Java多线程之线程状态总结

概述 线程大家肯定不陌生,对于线程中的运行状态,自己经常搞混淆,这边按照下图记录下: 线程一般来说有如下几种状态: 新建,可运行,超时阻塞,等待阻塞,同步阻塞,死亡 yeild:当线程执行了yield()方法后,将转到就绪状态,yield()方法只会给相同优先级或者更高优先级的线程一个运行的机会,与其他进程处于同等竞争状态,OS有可能会接着又让这个进程进入运行状态,yield()方法没有声明抛出任何异常 sleep:sleep()方法会给其他线程运行的机会,而不考虑其他线程的优先级,因此会给较低

Java多线程 2 线程的生命周期和状态控制

一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable). 注意:不能对已经启动的线程再次调用start()方法,否则会出现Java.lang.IllegalThreadStateException异常. 2.就绪状态 处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,处于线程就绪队列(尽管是采用队列形式,事实上,把它

iOS开发多线程篇—线程的状态

iOS开发多线程篇—线程的状态 一.简单介绍 线程的创建: self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(test) object:nil]; 说明:创建线程有多种方式,这里不做过多的介绍. 线程的开启: [self.thread start]; 线程的运行和阻塞: (1)设置线程阻塞1,阻塞2秒 [NSThread sleepForTimeInterval:2.0]; (2)第二种设置线程阻塞2,以当前时

iOS多线程技术—线程的状态

iOS多线程技术—线程的状态 一.简单介绍 线程的创建: self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(test) object:nil]; 说明:创建线程有多种方式,这里不做过多的介绍. 线程的开启: [self.thread start]; 线程的运行和阻塞: (1)设置线程阻塞1,阻塞2秒 [NSThread sleepForTimeInterval:2.0]; (2)第二种设置线程阻塞2,以当前时间

iOS开发多线程篇—线程的状态 - 文顶顶

原文  http://www.cnblogs.com/wendingding/p/3807184.html iOS开发多线程篇-线程的状态 一.简单介绍 线程的 创建 : self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(test) object:nil]; 说明:创建线程有多种方式,这里不做过多的介绍. 线程的 开启 : [self.thread start]; 线程的 运行 和 阻塞 : (1)设置线程阻塞

多线程学习-基础(二)线程状态装换

一.线程状态转换 下面的这个图非常重要!你如果看懂了这个图,那么对于多线程的理解将会更加深刻 状态说明:(1)新建状态(New):新创建了一个线程对象.(2)就绪状态(Runnable):线程被创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行的线程池中,变得可运行,等待获取cpu的使用权限.(3)运行状态(Running):就绪状态的线程获取了cpu的使用权,执行程序代码.(4)阻塞状态(Blocked):阻塞状态是线程由于某种原因放弃了cpu的使用权,暂时停止运行,直到

Java多线程(4)----线程的四种状态

与人有生老病死一样,线程也同样要经历开始(等待).运行.挂起和停止四种不同的状态.这四种状态都可以通过Thread类中的方法进行控制.下面给出了Thread类中和这四种状态相关的方法. 1 // 开始线程 2 public void start( ); 3 public void run( ); 4 5 // 挂起和唤醒线程 6 public void resume( ); // 不建议使用 7 public void suspend( ); // 不建议使用 8 public static v