Thread的Abort和Join方法一起用

下面是多线程的简单例子:

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);
            }
        }
    }
}

Thread的Abort和Join方法一起用_第1张图片取消//t.Join();的屏蔽后
Thread的Abort和Join方法一起用_第2张图片或者使用循环检查线程的状态,知道停止了才继续下面的行为:

while (t.IsAlive)//跟t.Join()作用一样,二者用其一就行
            {
                Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " t.Abort了,但是线程还没结束");
                Thread.Sleep(1);
            }

Thread的Abort和Join方法一起用_第3张图片
这段代码非常好懂,但是有一点要注意:
下面我们来解释一下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,线程状态也为停止了

你可能感兴趣的:(Thread的Abort和Join方法一起用)