你能看到这篇文章,说明你已经知道如何创建线程了,因此,这里就不说明线程的创建了,详细说一下线程的暂停和终止。
我们首先了解一下,什么是前台线程和后台线程。
.Net的公用语言运行时(CLR)能区分两种不同类型的线程:前台线程和后台线程。这两者的区别就是:应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。
对于如何暂停和继续线程的运行,在.net2.0之后,Suspend 、Resume 这两种方法都已停止使用,MS官方推荐使用标记判断的方式来处理线程的暂停与继续。
对于线程的终止,在该线程处理完该线程的指定任务,退出该线程执行任务的函数后,线程状态将改变为"Stopped",然后分别依前台线程和后台线程的区别,在应用程序退出时线程会自动结束。因此,如果我们想使某个线程停止执行,就使该线程所执行的函数执行完毕就可以了。
在使用多线程处理任务时,如果线程间的同步对象不是原子数值,而是类等引用类型,如果线程有写入的情况,则必须保证某一时刻只有一个线程能够写入,这就需要线程互斥,一般情况下,使用lock关键词处理。
互斥与同步
互斥和同步是两个紧密相关而又容易混淆的概念。
互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源,如“第一类读写者模型”。
对于在线程调用的方法中向外传递数据,使用事件向执行该方法的对象传递需要发送出的数据。
下面,是我测试的代码:
代码
1 usingSystem;2 usingSystem.Collections.Generic;3 usingSystem.Text;4 usingSystem.Threading;5 6 namespaceThreadTest7 {8 classProgram9 {10 staticvoidMain(string[] args)11 {12 try13 {14 Thread[] ts=newThread[2];15 ABC[] arr=newABC[2];16 ABC info;17 for(inti=0; i
这是执行结果:
如上图可见,线程执行时,其状态值为Background,当线程执行完成后,其状态值为Stopped.
以上是以后台线程为例。