文档介绍:第18章多线程
主要内容
本章主要讲解多线程的编程,学习的目标包括:理解多线程的概念;了解多线程提高程序性能的方式;掌握线程的创建、控制和同步;理解线程的生命周期、优先级和调度;理解线程的安全性;掌握线程的实现方式。
基本概念
多线程的概念
程序是一段静态的代码,是应用软件执行的蓝本。
进程是应用程序的一个运行例程,是应用程序的一次动态执行过程。进程由若干个代码和数据块组成,每个进程还拥有其他的资源,如文件、动态内存地址、线程等。
线程是进程中的一个执行单元。一个进程可以包含若干个线程。同一进程中的各个线程对应于一组CPU指令、一组CPU寄存器以及一个堆栈。进程并不执行代码,它只是代码存放的地址空间。进程地址空间中所存放的代码由线程来执行。
多线程处理可以同时运行多个任务,因此多线程技术可以使程序的响应速度更快,可以让占用大量处理时间的任务和当前没有进行处理的任务定期将处理器时间让给别的任务,可以随时停止任务,还可以设置每个任务的优先级以优化程序性能。
C#中的线程实现方法(1)
系统以对象方式来管理进程和线程,因此系统提供了线程对象。在C#中,实现多线程有多种方法,最常见的三种方法是分别使用Timer类(线程计数器)、ThreadPool(线程池)类和Thread(线程)类。
Timer类
Timer类提供以指定的时间间隔执行方法的机制。该类是sealed类,不能被继承。
调用Timer类的构造方法时,使用TimerCallback委托指定希望Timer执行的方法。计时器委托在构造计时器时指定,并且不能更改。此方法不在创建计时器的线程中执行,而是在系统提供的线程池线程中执行。创建计时器时,可以指定在第一次执行方法之前等待的时间量(截止时间)以及此后的执行期间等待的时间量(时间周期)。可以使用Change()方法更改这些值或禁用计时器。当不再需要计时器时,可以使用Dispose()方法释放计时器持有的资源。
,而且由线程池线程服务,简单且对资源要求不高。Timer类适用于间隔性地完成任务。
C#中的线程实现方法(2)
ThreadPool类
ThreadPool为大多数任务提供最佳的基本线程创建和管理机制。该类使用户能够请求某一线程执行任务而不必亲自完成任何线程管理工作。
ThreadPool类提供一个线程池,该线程池可用于发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。许多应用程序创建的线程都要在休眠状态中消耗大量时间,以等待事件发生。其他线程可能进入休眠状态,只被定期唤醒以轮询更改或更新状态信息。线程池通过为应用程序提供一个由系统管理的辅助线程池让用户更有效地使用线程。一个线程监视排到线程池的若干个等待操作的状态。当一个等待操作完成时,线程池中的一个辅助线程就会执行对应的回调函数。
C#中的线程实现方法(3)
Thread类
Timer类适用于间隔性地完成任务。
ThreadPool类适用于多个小的线程。
Thread类是实现线程的主要方法,它适用于各种情况。
Thread类
Thread类
线程的状态和生命周期
在公共语言运行库中创建线程A
A响
应Su
spend
请求
SuspendedRequested
Suspended
BackGround
WaitSleepJoin
Unstarted
Abort
Stopped
AbortRequested
StoppedRequested
A调用start( )
B调用Interrupt( )
设
ou
置
A的
Is
属
Ba
ck
nd
性
Gr
A调用sleep( )
B调用wait( ), Join( )
B调
用Re
sume ( )
线
完
程
成
B
用
调
u
s
S
e
nd ( )
p
响
应
请
Abort
求
A
B
调
Abort( )
用
Running
B调
用Re
sume ( )
线程的生命周期示意图
多线程编程的基本步骤(1)
第一个步骤是定义Thread对象。Thread类是一个sealed类,不能被继承,可以创建Thread类的实例。每个线程指代一个方法,称为线程方法或线程函数,该方法无参数,且返回值类型为void。若需要传递相关的参数,可以使用对象的成员变量或方法。生成Thread实例时,首先定义一个指代,然后定义一个Thread对象,调用Thread类的构造方法生成该实例。例如,下列代码生成一个