专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » 多线程:C#多线程学习( 2) 如何操纵一个线程 »正文

多线程:C#多线程学习( 2) 如何操纵一个线程

来源: 发布时间:星期五, 2009年1月9日 浏览:99次 评论:0
  下面我们就动手来创建个线程使用Thread类创建线程时只需提供线程入口即可(线程入口使知道该让这个线程干什么事)

  在C#中线程入口是通过ThreadStart代理(delegate)来提供你可以把ThreadStart理解为指针指向线程要执行Thread.Start思路方法后线程就开始执行ThreadStart所代表或者说指向

  打开你VS.net新建个控制台应用(Console Application)编写完全控制个线程代码举例:

//ThreadTest.cs
using;
using.Threading;
ThreadTest
{
  publicAlpha
  {
      publicvoidBeta
      {
        while(true)
        {
          Console.WriteLine("Alpha.Betaisrunninginitsownthread.");
        }
      }
  };
  publicSimple
  {
      publicMain
      {
        Console.WriteLine("ThreadStart/Stop/JoinSample");
        AlphaoAlpha=Alpha;
        file://这里创建个线程使的执行Alpha类Beta思路方法
        ThreadoThread=Thread(ThreadStart(oAlpha.Beta));
        oThread.Start;
        while(!oThread.IsAlive)
           Thread.Sleep(1);
        oThread.Abort;
        oThread.Join;
        Console.WriteLine;
        Console.WriteLine("Alpha.Betahasfinished");
        try
        {
          Console.WriteLine("TrytorestarttheAlpha.Betathread");
          oThread.Start;
        }
        catch(ThreadStateException)
        {
          Console.Write("ThreadStateExceptiontryingtorestartAlpha.Beta.");
          Console.WriteLine("Expectedsinceabortedthreadscannotberestarted.");
          Console.ReadLine;
        }
        0;
      }
  }
}


  这段包含两个类Alpha和Simple在创建线程oThread时我们用指向Alpha.Beta思路方法化了ThreadStart代理(delegate)对象当我们创建线程oThreadoThread.Start思路方法启动时实际上运行是Alpha.Beta思路方法:

  Alpha oAlpha = Alpha;

  Thread oThread = Thread( ThreadStart(oAlpha.Beta));

  oThread.Start;

  然后在Mainwhile循环中我们使用静态思路方法Thread.Sleep让主线程停了1ms这段时间CPU转向执行线程oThread然后我们试图用Thread.Abort思路方法终止线程oThread注意后面oThread.JoinThread.Join思路方法使主线程等待直到oThread线程结束你可以给Thread.Join思路方法指定参数作为等待最长时间的后我们试图用Thread.Start思路方法重新启动线程oThread但是显然Abort思路方法带来后果是不可恢复终止线程所以最后会抛出ThreadStateException异常

  主线程Main

  所有线程都是依附于Main所在线程Main是C#入口起始线程可以称的为主线程

  如果所有前台线程都停止了那么主线程可以终止而所有后台线程都将无条件终止

  所有线程虽然在微观上是串行执行但是在宏观上你完全可以认为它们在并行执行

  Thread.ThreadState 属性

  这个属性代表了线程运行时状态在区别情况下有区别我们有时候可以通过对该值判断来设计流程

  ThreadState 属性取值如下:

  Aborted:线程已停止;

  AbortRequested:线程Thread.Abort思路方法已被但是线程还未停止;

  Background:线程在后台执行和属性Thread.IsBackground有关;



  Running:线程正在正常运行;

  Stopped:线程已经被停止;

  StopRequested:线程正在被要求停止;

  Suspended:线程已经被挂起(此状态下可以通过Resume思路方法重新运行);

  SuspendRequested:线程正在要求被挂起但是未来得及响应;

  Unstarted:未Thread.Start开始线程运行;

  WaitSleepJoin:线程了Wait,Sleep或Join等思路方法处于封锁状态;

  上面提到了Background状态表示该线程在后台运行那么后台运行线程有什么特别地方呢?其实后台线程跟前台线程只有个区别那就是后台线程不妨碍终止个进程所有前台线程都终止后CLR(通用语言运行环境)将通过任意个存活中后台进程Abort思路方法来彻底终止进程

  线程优先级

  当线程的间争夺CPU时间时CPU 是按照线程优先级给予服务在C#应用用户可以设定5个区别优先级由高到低分别是HighestAboveNormalNormalBelowNormalLowest在创建线程时如果不指定优先级那么系统默认为ThreadPriority.Normal

  给个线程指定优先级我们可以使用如下代码:

  //设定优先级为最低

  myThread.Priority=ThreadPriority.Lowest;

  通过设定线程优先级我们可以安排些相对重要线程优先执行例如对用户响应等等



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: