每个正在操作系统上运行的应用程序都是一个进程,一个进程可以包括一个或多个线程。线程是操作系统分配处理器时间的基本单元,在进程中可以有多个线程同时执行代码。每个线程都维护异常处理程序、调度优先级和一组系统用于在调度该线程前保存线程上下文的结构。线程上下文包括为使线程在线程的宿主进程地址空间中无缝地继续执行所需的所有信息,包括线程的CPU寄存器组和堆栈。
一、线程基础
1.单线程
单线程顾名思义,就是只有一个线程。默认情况下,系统为应用程序分配一个主线程,该线程执行程序中以Main()方法开始和结束的代码。
2.多线程
需要用户交互的软件都必须尽可能快地对用户的活动做出反应,以便提供丰富多彩的用户体验,但同时它又必须执行必要的计算以便尽可能快地将数据呈现给用户,这时可以使用多线程来实现。
(1)多线程的缺点
要提高对用户的响应速度并且处理所需数据以便几乎同时完成工作,使用多线程是一种最为强大的技术,在具有一个处理器的计算机上,多线程可以通过利用用户事件之间很小的时间段在后台处理数据来达到这种效果。例如,通过使用多线程,在另一个线程正在重新计算同一应用程序中的电子表格的其他部分时,用户可以编辑该电子表格。
单个应用程序域可以使用多线程来完成以下任务。
Dart
☑ 通过网络与Web服务器和数据库进行通信。
☑ 执行占用大量时间的操作。
☑ 区分具有不同优先级的任务。
☑ 使用户界面可以在将时间分配给后台任务时仍能快速做出响应。
(2)多线程的缺点
使用多线程有好处,同时也有坏处,建议一般不要在程序中使用太多的线程,这样可以最大限度地减少操作系统资源的使用,并可提高性能。
如果在程序中使用了多线程,可能会产生如下问题。
Dart
☑ 系统将为进程、AppDomain对象和线程所需的上下文信息使用内存。因此,可以创建的进程、AppDomain对象和线程的数目会受到可用内存的限制。
☑ 跟踪大量的线程将占用大量的处理器时间。如果线程过多,则其中大多数线程都不会产生明显的进度。如果大多数当前线程处于一个进程中,则其他进程中的线程的调度频率就会很低。
☑ 使用许多线程控制代码执行非常复杂,并可能产生许多bug。
☑ 销毁线程需要了解可能发生的问题并对那些问题进行处理。
二、线程操作
Thread类位于System.Threading命名空间下,System.Threading命名空间提供一些可以进行多线程编程的类和接口。除同步线程活动和访问数据的类(Mutex、Monitor、Interlocked和AutoResetEvent 等)外,该命名空间还包含一个ThreadPool类(它允许用户使用系统提供的线程池)和一个Timer类(它在线程池的线程上执行回调方法)。
Thread类主要用于创建并控制线程、设置线程优先级并获取其状态。一个进程可以创建一个或多个线程以执行与该进程关联的部分程序代码,线程执行的程序代码由ThreadStart委托或ParameterizedThreadStart委托指定。
线程运行期间,不同的时刻会表现为不同的状态,但它总是处于由ThreadState定义的一个或多个状态中。用户可以通过使用ThreadPriority枚举为线程定义优先级,但不能保证操作系统会接受该优先级。
Thread类的常用属性及说明如表
|-----------------|-----------------------|
| 属 性 | 说 明 |
| ApartmentState | 状取或设置此线程的单元状态 |
| CurrentContex | 获取线程正在其中执行的当前上下文 |
| CurrentThread | 获取当前正在运行的线程 |
| isAlive | 获取一个值,该值指示当前线程的执行状态 |
| ManagedThreadld | 获取当前托管线程的唯一标识符 |
| Name | 获取或设置线程的名称 |
| Priority | 获取或设置一个值,该值指示线程的调度优先级 |
| ThreadState | 获取一个值,该值包含当前线程的状态 |
Thread类的常用方法及说明如表
|-------------------|-----------------------------------------------------------|
| 方 法 | 说 明 |
| Abort | 在调用此方法的线程上引发ThreadAbortException,以开始终止此线程的过程。调用此方法通常会终止线程 |
| GetApartmentState | 返回一个ApartmentState值,该值指示单元状态 |
| GetDomain | 返回当前线程正在其中运行的当前域 |
| GetDomainID | 返回唯一的应用程序域标识符 |
| Interrupt | 中断处于WaitSleepJoin线程状态的线程 |
| Join | 阻止调用线程,直到某个线程终止时为止 |
| ResetAbort | 取消为当前线程请求的Abort |
| Resume | 维续已挂起的线程 |
| SetApartmentState | 在线程启动前设置其单元状态 |
| Sleep | 将当前线程阻止指定的毫秒数 |
| SpinWait | 导致线程等待由iterations参数定义的时间量 |
| Start | 使线程被安排进行执行 |
| Suspend | 挂起线程,或者如果线程已挂起,则不起作用 |
| VolatileRead | 读取字段值。无论处理器的数目或处理器缓存的状态如何,该值都是由计算机的任何处理器写入的最新值 |
| VolatileWrite | 立即向字段写入一个值,以使该值对计算机中的所有处理器都可见 |