热爱测试,主要研究性能测试和自动化测试方面的技术,希望与同样对测试有热情的你一同进步成长

c#多线程的学习(1)(转)

上一篇 / 下一篇  2007-07-26 17:12:55 / 个人分类:软件开发

z*b qc ErW3t0  .NET中,关于多线程的类都在System.Threading命名空间中.其中提供Thread类用于创建线程51Testing软件测试网 ?6T"qqx ^

la~%U)~8m;I$Y0它的主要方法:

z8l&f+}7OW0
·                                 Start():启动线程
·                                 Sleep(int):静态方法,暂停当前线程指定的毫秒数
·                                 Abort():通常使用该方法来终止一个线程
·                                 Suspend():该方法并不终止未完成的线程,它仅仅挂起线程,以后还可恢复。
·                                 Resume():恢复被Suspend()方法挂起的线程的执行
 
使用                  Thread类创建线程时,只需提供线程入口即可。线程入口使程序知道该让这个线程干什么事,在C#中,线程入口是通过ThreadStart代理(delegate)来提供的,你可以把ThreadStart理解为一个函数指针,指向线程要执行的函数,当调用Thread.Start()方法后,线程就开始执行ThreadStart所代表或者说指向的函数。
usin         using System;
GDwf#YU?0using System.Threading;
@*?^0v?}kY_w051Testing软件测试网6j4@3xE4C^-c
namespace ThreadTest51Testing软件测试网I|mI"V|
{51Testing软件测试网)z6g;a9I UM6w!u
  public class Alpha
;@4Ghy3Z1m4GM0
    {51Testing软件测试网)_6bN+{ Z^Q
      public void Beta()
v"GE-F9k5t7m/U @0
      {
$cZ.f'K:P%o*]0
        while (true)51Testing软件测试网+T9C o K\B!l1Z m
        {51Testing软件测试网R6@ j9K-N5u*O
          Console.WriteLine("Alpha.Beta is running in its own thread.");51Testing软件测试网0? E'@k%a h
        }51Testing软件测试网7c4K_W/ER%y^ F8d,r
      }
_/p7P~ q~0
    }; 51Testing软件测试网t Y C `n;DPht,z
51Testing软件测试网ik j&G'h*b!m&b
    public class Simple51Testing软件测试网2x g*@3BzY
    {51Testing软件测试网r8D%\ _f s&`bz2f
      public static int Main()51Testing软件测试网6brs]+MC
      {
]:Z"NoXu0
        Console.WriteLine("Thread Start/Stop/Join Sample");
)v/e6W+Q^g051Testing软件测试网SH{T1CR4k0^
        Alpha ōAlpha = new Alpha();51Testing软件测试网%zx%sY[.f,gD
        file://这里创建一个线程,使之执行Alpha类的Beta()方法51Testing软件测试网,u,Q}:BE/^
        Thread ōThread = new Thread(new ThreadStart(oAlpha.Beta));51Testing软件测试网v;o#}NzF0]/t&i
        oThread.Start();
[l#X8[ P0
        while (!oThread.IsAlive);
;iE-]A`!O5N9UZ0
        Thread.Sleep(1);
DMp6q$OI0
        oThread.Abort();
n3S5Nl'ccW1O;O0
        oThread.Join();51Testing软件测试网em ym:X%c&Qc:\1^
        Console.WriteLine();
Mh/hAP0
        Console.WriteLine("Alpha.Beta has finished");
`4f,@ p6_9wk0
        try
7R qM p/M/bw)W0
        {
E y5ea;\Q/d0
          Console.WriteLine("Try to restart the Alpha.Beta thread");51Testing软件测试网F|/UvdM
          oThread.Start();51Testing软件测试网Za1o1{4_;LS:B
        }
Jv,P'G;@x0
        catch (ThreadStateException) 51Testing软件测试网9q nB&Gj` p
        {
\xq%r2k w)K)?N0
          Console.Write("ThreadStateException trying to restart Alpha.Beta. ");51Testing软件测试网#i"iU!Te&qrK
          Console.WriteLine("Expected since aborted threads cannot be restarted.");
(y#j GA+B#Ix]0
          Console.ReadLine();51Testing软件测试网1foXJ!_ i~
        }51Testing软件测试网XE}uo U
        return 0;51Testing软件测试网:S7L syf!Jf/I
      }51Testing软件测试网'_#j:Z|2uR{#z*Q H4pJ
    }
8R?G[ ``XP0
  }
这段程序包含两个类AlphaSimple,在创建线程oThread时我们用指向Alpha.Beta()方法的初始化了ThreadStart代理(delegate)对象,当我们创建的线程oThread调用oThread.Start()方法启动时,实际上程序运行的是Alpha.Beta()方法:
Alpha ōAlpha = new Alpha();
;w&Zo ptP0
  Thread ōThread = new Thread(new ThreadStart(oAlpha.Beta));
$_$[6F-Eji0
  oThread.Start();
51Testing软件测试网6H&P Z4?NuQ J
然后在Main()函数的while循环中,我们使用静态方法Thread.Sleep()让主线程停了1ms,这段时间CPU转向执行线程oThread。然后我们试图用Thread.Abort()方法终止线程oThread,注意后面的oThread.Join()Thread.Join()方法使主线程等待,直到oThread线程结束。你可以给Thread.Join()方法指定一个int型的参数作为等待的最长时间。之后,我们试图用Thread.Start()方法重新启动线程oThread,但是显然Abort()方法带来的后果是不可恢复的终止线程,所以最后程序会抛出ThreadStateException异常。 51Testing软件测试网A;mC+D \y2t1s
51Testing软件测试网Yfqo7n:t(g'h]"`
其它线程都是依附于Main()函数所在的线程的,Main()函数是C#程序的入口,起始线程可以称之为主线程,如果所有的前台线程都停止了,那么主线程可以终止,而所有的后台线程都将无条件终止。而所有的线程虽然在微观上是串行执行的,但是在宏观上你完全可以认为它们在并行执行。
njJ,H5w'o051Testing软件测试网9R.tq0xg C7o
读者一定注意到了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()方法来彻底终止进程。 51Testing软件测试网#p9h3X;a4mkq6a

\7h_6M!v(A*D'M)m0
当线程之间争夺CPU时间时,CPU按照是线程的优先级给予服务的。在C#应用程序中,用户可以设定5个不同的优先级,由高到低分别是HighestAboveNormalNormalBelowNormalLowest,在创建线程时如果不指定优先级,那么系统默认为ThreadPriority.Normal。给一个线程指定优先级51Testing软件测试网g9Q[ i~$b&pD
,我们可以使用如下代码:
//设定优先级为最低
%Ut$L;C;n0
myThread.Priority=ThreadPriority.Lowest;

)W5|1a`8`u|N"Kg0
通过设定线程的优先级,我们可以安排一些相对重要的线程优先执行,例如对用户的响应等等。
5M F"T/yZc.k;l0
 

TAG: 软件开发

 

评分:0

我来说两句

Open Toolbar