C# 线程的基本操作(三)

05  终止线程

 终止线程可以分别使用 Thread 类的 Abort 方法和 Join 方法实现,下面对这两个方法进行详细介绍。

 1.  Abort 方法

 Abort 方法用来终止线程,它有两种重载形式,下面分别进行介绍。

(1) 终止线程,在调用该方法的线程上引发 ThreadAbortException 异常,以开始终止该线程的过程。

  语法如下:

  public  void Abort()

(2)终止线程,在调用该方法的线程上引发 ThreadAbortException 异常,以开始终止该线程并提供有关线程终止的异常信息的过程。

 语法如下:

 public  void Abort(Object stateInfo)

 stateInfo:一个对象,它包含应用程序特定的信息(如状态),该信息可供正被终止的线程使用。

【例5】 创建一个控制台应用程序,在其中开始一个线程,然后调用 Thread 类的 Abort 方法终止已开启的线程。

代码如下:

static void Main(string[] args)
{
     Thread myThread;                                       //声明线程 
     //用线程起始点的 ThreadStart 委托创建该线程的实例
     myThread = new Thread(new ThreadStart(createThread));
     myThread.Start();                                      //启动线程 
     myThread.Abort();                                      //终止线程
}
public static void createThread()
{    
     Console.Write("线程实例");
}

 注意

         线程的 Abort 方法用于永久地停止托管线程,调用 Abort 方法时,公共语言运行库在目标线程中引发 ThreadAbortException 异常,目标线程可捕捉该异常,一旦线程被终止,它将无法重新启动。

 2.  Join 方法

 Join 方法用来阻止调用线程,直到某个线程终止时为止。它有 3 种重载形式,下面分别进行介绍。

(1)在继续执行标准的 COM 和 SendMessage 消息处理期间阻止调用线程,直到某个线程终止为止。

语法如下:

public  void Join()

(2)在继续执行标准的 COM 和 SendMessage 消息处理期间阻止调用线程,直到某个线程终止或经过指定时间为止。 

语法如下:

 public  bool Join(int millisecondsTimeout)

b59ea0e8ddeca5fcbb2f59e94f6bc7f2.png  millisecondsTimeout:等待线程终止的毫秒数。

00dc55a4ae232f7089360056462066c9.png  返回值:如果线程已终止,则为true;如果线程在经过 millisecondsTimeout 参数指定的时间量后未终止,则为 false。

(3)在继续执行标准的 COM 和 SendMessage 消息处理期间阻止调用线程,直到某个线程终止或经过指定时间为止。

语法如下:

public  bool Join(TimeSpan timeout)

09d381a9d98ea05ea008c415745e77a1.png  timeout:等待线程终止的时间量的 TimeSpan。

a34fd5d43c33ff2e0294ccdb7254e113.png   返回值:如果线程已终止,则为 true;如果线程在经过了 timeout 参数指定的时间量后来终止,则为 false。

【例6】创建一个控制台应用程序,其中调用了 Thread 类的 Join 方法等待线程终止。

代码如下:

static void Main(string[] args)
{
     Thread myThread;                                        //声明线程 
     //用线程起始点的 ThreadStart 委托创建该线程的实例
     myThread = new Thread(new ThreadStart(createThread));
     myThread.Start();                                      //启动线程 
     myThread Jion();                                       //阻止调用该线程,直到该线程终止
 }
 public static void createThread() 
 {
     Console.write("线程实例");
 }

 注意

         如果在应用程序中使用了多线程,辅助线程还没有执行完毕,在关闭窗体时必须关闭辅助线程,否则会引发异常。

06  线程的优先级

 线程的优先级指定一个线程相对于另一个线程的相对优先级,每个线程都有一个分配的优先级。在公共语言运行库内创建的线程最初被分配为 Normal 优先级,而在公共语言运行库外创建的线程,在进入公共语言运行库时将保留其先前的优先级。

线程是根据其优先级而调度执行的,用于确定线程执行顺序的调度算法随操作系统的不同而不同,在某些操作系统下,具有最高优先级(相对于可执行线程而言)的线程经过调度后总是首先运行。如果具有相同优先级的多个线程都可用,则程序将遍历处于该优先级的线程,并为每个线程提供一个固定的时间片段来执行。只有具有较高优先级的线程才可以运行,具有较低优先级的线程不会执行。如果在给定的优先级上不再有可运行的线程,则程序将移到下一个较低的优先级并在该优先级上调度线程以执行。如果具有较高优先级的线程可以运行,则具有较低优先级的线程将被抢先,并允许具有较高优先级的线程再次执行。除此之外,当应用程序的用户界面在前台和后台之间移动时,操作系统还可以动态调整线程的优先级。

说明

         一个线程的优先级不影响该线程的状态,该线程的状态在操作系统可以调度该线程之前必须为 Running。

 线程的优先级值及说明如表3 所示。

表3   线程的优先级值及说明

9ec7ff50b3e89b51cdfaf954a85e8443.png

可以通过访问线程的 Priority 属性来获取和设置其优先级。Priority 属性用来获取或设置一个值,该值指示线程的调度优先级。

语法如下:

public  ThreadPriority Priority { get; set; }

属性值:ThreadPriority 值之一。默认值为 Normal。

【例7】创建一个控制台应用程序,其中创建了两个Thread 线程类对象,并设置第一个 Thread 类对象的优先级为最低,然后调用 Start 方法开启这两个线程。

代码如下:

static void Main(string[] args)
{
    Thread thrad1=wnew Thread(new ThreadStart(Thread1));             //使用自定义方法 Thread1 声明线程 
    thread1.Priority = ThreadPriority.Lowest;                        //设置线程的调度优先级
    Thread thread2 = new Thread(new ThreadStart(Thread2));          //使用自定义方法 Thread2 声明线程
    thread1.Start();                                                //开启线程一
    thread2.Start();                                                //开启线程二
}
static void Thread1()
{
     Console.WriteLine("线程一"); 
}
static void Thread2()
{
     Console.WriteLine("线程二")
}

程序的运行结果如图4 所示。

f98a1b4aad14f02c58991c18642800cc.png

图4 设置线程的优先级

- END -


4c9b388ad02939b994cb1ab21f1fc08a.png


关注小编不迷路呦

-----------------------------------

需要进技术群交流的,请添加小编zls20210502

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值