热爱测试,主要研究性能测试和自动化测试方面的技术,希望与同样对测试有热情的你一同进步成长
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?0using 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/E R%y^ F8d,r
}
_/p7P~
q~0 }; 51Testing软件测试网t
YC
`n;DPht,z
51Testing软件测试网i kj&G'h*b!m&b
public class Simple51Testing软件测试网2xg*@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);
[2eDMp6q$OI0 oThread.Abort();
n3S5Nl'ccW1O;O0 oThread.Join();51Testing软件测试网emym:X%c&Qc:\1^
Console.WriteLine();
Mh/hAP0 Console.WriteLine("Alpha.Beta has finished");
`4f,@p6_9wk0 try
7RqMp/M/bw)W0 {
Ey5ea;\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%r2kw)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[
``X P0 }
这段程序包含两个类Alpha和Simple,在创建线程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&PZ4?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个不同的优先级,由高到低分别是Highest,AboveNormal,Normal,BelowNormal,Lowest,在创建线程时如果不指定优先级,那么系统默认为ThreadPriority.Normal。给一个线程指定优先级51Testing软件测试网g9Q[ i~$b&pD
,我们可以使用如下代码:
//设定优先级为最低 %Ut$L;C;n0myThread.Priority=ThreadPriority.Lowest; |
)W5|1a`8`u|N"Kg0通过设定线程的优先级,我们可以安排一些相对重要的线程优先执行,例如对用户的响应等等。
5M F"T/yZc.k;l0
收藏
举报
TAG:
软件开发