下面是多线程的简单例子:
using System;
using System.Threading;
namespace biovision.ihospital.his.Basic
{
public class Simple
{
public static int Main()
{
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " Thread Start/stop/join sample");
Alpha alpha = new Alpha();
Thread t = new Thread(new ThreadStart(alpha.Beta));
t.Start();
while (!t.IsAlive) Thread.Sleep(1);
Thread.Sleep(1000);
t.Abort();
//t.Join();
/*while (t.IsAlive)//跟t.Join()作用一样,二者用其一就行
{
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " t.Abort了,但是线程还没结束");
Thread.Sleep(1);
}*/
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " alpha.Beta 已经结束,执行状态为" + t.IsAlive.ToString() + "线程状态为:" + t.ThreadState.ToString());
try
{
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " 试图重新启动 alpha.Beta");
t.Start();
}
catch (ThreadStateException)
{
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " ThreadStateException 试图重新启动t线程");
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " t线程终止后不能被重启");
Console.ReadLine();
} return 0;
}
}
public class Alpha
{
public void Beta()
{
while (true)
{
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff")+" Alpha.Beta 正在运行");
Thread.Sleep(10000);
}
}
}
}
取消//t.Join();的屏蔽后
或者使用循环检查线程的状态,知道停止了才继续下面的行为:
while (t.IsAlive)//跟t.Join()作用一样,二者用其一就行
{
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " t.Abort了,但是线程还没结束");
Thread.Sleep(1);
}
这段代码非常好懂,但是有一点要注意:
下面我们来解释一下Abort方法是如何工作的。因为公用语言运行时管理了所有的托管的线程,同样它能在每个线程内抛出异常。Abort方法能在目标线程中抛出一个ThreadAbortException异常从而导致目标线程的终止。不过Abort方法被调用后,目标线程可能并不是马上就终止了。因为只要目标线程正在调用非托管的代码而且还没有返回的话,该线程就不会立即终止。而如果目标线程在调用非托管的代码而且陷入了一个死循环的话,该目标线程就根本不会终止。不过这种情况只是一些特例,更多的情况是目标线程在调用托管的代码,一旦Abort被调用那么该线程就立即终止了。
其实一个线程在运行时,我们可以通过Thread.ThreadState属性读出它的状态,正在运行的线程状态就是ThreadState.Running。然后如果我们想强制停止正在执行的线程,就会调用Thread.Abort方法,但是Thread.Abort方法做的事情只是在线程上抛出了一个ThreadAbortException异常,然后将线程的状态置为ThreadState.AbortRequested,MSDN对AbortRequested状态的解释是:已对线程调用了 Thread.Abort 方法,但线程尚未收到试图终止它的挂起的System.Threading.ThreadAbortException,也就是说线程在ThreadState.AbortRequested状态时表示即将结束但是还没有真正结束。可是Thread.Abort方法将线程的状态置为ThreadState.AbortRequested后就立马返回了,而线程真正结束后的状态应该是ThreadState.Aborted,所以一定要注意在调用了Thread.Abort方法后,要记得循环检查Thread.ThreadState属性的值或者调用Thread.Join方法来确保被终止线程已经真正停止,只有当Thread.ThreadState属性为Aborted或Thread.Join方法返回时,才表示线程真正结束了。
join():阻止调用某个线程,直到某个线程终止为止。
t.IsAliv:表示当前线程的执行状态
t.ThreadState:该值包含线程的状态
结论:
1.abort()的功能是用来终止调用此方法的线程的,只是在多数情况下,它需要一点时间,有些延迟(可能在短时间内此线程还在执行)…
2.join()方法它的功能不是终止线程,而是在t线程终止之前,阻止正在结束(调用了abort()方法但还未结束)的t线程执行,同时使主线程等待,直到t线程终止(也就是abort()方法终止过程完毕)了再执行下面的代码,打印出来的结果,执行状态就为FALSE,线程状态也为停止了