第九讲多线程程序设计.pdf
《第九讲多线程程序设计.pdf》由会员分享,可在线阅读,更多相关《第九讲多线程程序设计.pdf(80页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第九讲第九讲 多线程程序设计多线程程序设计周开来周开来西南林学院计算机与信息科学系西南林学院计算机与信息科学系多线程程序设计多线程程序设计?进程与线程进程与线程(Process and Threading)(Process and Threading)?异步与同步异步与同步?线程概念线程概念?ThreadThread类类?等等等等1.1 1.1 多线程与多任务多线程与多任务多线程与多任务多线程与多任务?多任务指一个操作系统同时运行多个程序的能力(一 个 运 行 中 的 程 序 称 为 一 个 进 程-Process);多线程(Multithreading)是一个程序实现多任务的能力;?并发(C
2、oncurrency)多个线程或进程在单个CPU上运行(可以同时执行,也可以不同时执行,可以在执行中,也可以在中断状态),并行(Parallelism)是多个线程或进程在多个CPU上同时并行运行;Java的多线程程序可以在单CPU下并发运行,也可在多CPU下并行运行。引言引言?DOS时代-单任务单用户A任务B任务C任务?Windows 9.X时代-多任务单用户?宏观上看:?A任务?B任务?C任务?比如:用户可以一边打字,一边听歌,还可以一边下载电影?微观上看:?A任务B任务C任务 A任务B任务C任务?Windows NT/2000 Server-多任务,多用户D任务相关概念相关概念?进程进程进
3、程进程?每一个程序对应一个进程,代表着执行的一个任务。每一个程序对应一个进程,代表着执行的一个任务。每一个程序对应一个进程,代表着执行的一个任务。每一个程序对应一个进程,代表着执行的一个任务。?进程由操作系统负责管理和调度进程由操作系统负责管理和调度进程由操作系统负责管理和调度进程由操作系统负责管理和调度?每个进程拥有自己独立的内存空间每个进程拥有自己独立的内存空间每个进程拥有自己独立的内存空间每个进程拥有自己独立的内存空间,堆栈和环境变量设置,进堆栈和环境变量设置,进堆栈和环境变量设置,进堆栈和环境变量设置,进程之间互不影响程之间互不影响程之间互不影响程之间互不影响?线程线程线程线程?线程可
4、以被描述为一个微进程线程可以被描述为一个微进程线程可以被描述为一个微进程线程可以被描述为一个微进程,它拥有起点它拥有起点它拥有起点它拥有起点,执行的顺序系列和执行的顺序系列和执行的顺序系列和执行的顺序系列和一个终点。一个终点。一个终点。一个终点。?线程是在进程的内部执行的指令序列线程是在进程的内部执行的指令序列线程是在进程的内部执行的指令序列线程是在进程的内部执行的指令序列,由进程负责管理和调度由进程负责管理和调度由进程负责管理和调度由进程负责管理和调度?在进程内的每个线程共享相同的内存空间和数据资源在进程内的每个线程共享相同的内存空间和数据资源在进程内的每个线程共享相同的内存空间和数据资源在
5、进程内的每个线程共享相同的内存空间和数据资源相关概念相关概念?进程进程?每一个程序对应一个进程,代表着执行的一个任务。每一个程序对应一个进程,代表着执行的一个任务。?进程由操作系统负责管理和调度进程由操作系统负责管理和调度?每个进程拥有自己独立的内存空间每个进程拥有自己独立的内存空间,堆栈和环境变量堆栈和环境变量设置,进程之间互不影响设置,进程之间互不影响?线程线程?线程可以被描述为一个微进程线程可以被描述为一个微进程,它拥有起点它拥有起点,执行的顺执行的顺序系列和一个终点。序系列和一个终点。?线程是在进程的内部执行的指令序列线程是在进程的内部执行的指令序列,由进程负责管由进程负责管理和调度理
6、和调度?在进程内的每个线程共享相同的内存空间和数据资源在进程内的每个线程共享相同的内存空间和数据资源通过通过WindowsWindows的任务管理器可以查看的任务管理器可以查看系统进程系统进程举例举例线程概念线程概念.NET.NET下的应用程序域下的应用程序域?在在.NET.NET下,程序集并没有直接承载在进程下,程序集并没有直接承载在进程中,而(传统的中,而(传统的Win32Win32程序是直接承载的)程序是直接承载的)?在在.NET.NET下,可执行程序承载在进程中的一个下,可执行程序承载在进程中的一个逻辑分区中,术语为应用程序域逻辑分区中,术语为应用程序域(AppDomainAppDom
7、ain)?一个进程可以包含多个应用程序域,每一个一个进程可以包含多个应用程序域,每一个应用程序域承载一个应用程序域承载一个.NET.NET可执行程序可执行程序应用应用程序域的优势应用应用程序域的优势?应用程序域是应用程序域是.NET.NET平台操作系统独立性的关平台操作系统独立性的关键特性键特性,这种逻辑分区将不同操作系统表现加这种逻辑分区将不同操作系统表现加载可执行程序的差异抽象化了载可执行程序的差异抽象化了?和一个完整的进程相比,应用程序域的和一个完整的进程相比,应用程序域的CPUCPU和内存占用都要小得多,因此和内存占用都要小得多,因此CLRCLR加载和卸加载和卸载应用程序域比起完整的进
8、程来说快得多载应用程序域比起完整的进程来说快得多?应用程序域为承载的应用程序域提供了深度应用程序域为承载的应用程序域提供了深度的隔离,如果进程中某一个应用程序域失败的隔离,如果进程中某一个应用程序域失败了,剩余的应用程序域也能保持正常了,剩余的应用程序域也能保持正常.NET.NET程序域、进程、线程关系程序域、进程、线程关系?应用程序域是承载应用程序域是承载.NET.NET程序集的进程逻辑分程序集的进程逻辑分区区?单个进程可以承载多个应用程序域单个进程可以承载多个应用程序域?每一个应用程序域都和该进程中的其他应用每一个应用程序域都和该进程中的其他应用程序域完全彻底地隔离开程序域完全彻底地隔离开
9、?线程是线程是.NET.NET下可独立执行的一个逻辑代码单下可独立执行的一个逻辑代码单元元?线程可运行在一个程序域上,也可以跨越多线程可运行在一个程序域上,也可以跨越多个应用程序域个应用程序域?在任意某一个时刻,只有某一个应用程序域在任意某一个时刻,只有某一个应用程序域上的线程在运行上的线程在运行进程进程线程线程应用程序域应用程序域代码代码代码代码数据数据数据数据文件文件文件文件应用程序域应用程序域应用程序域应用程序域应用程序域应用程序域应用程序域应用程序域进程进程进程进程什么是多线程?什么是多线程?什么是多线程?什么是多线程??多线程是为了使得多个线程并行的工作以完成多项任多线程是为了使得多
10、个线程并行的工作以完成多项任务,以提高系统的效率。务,以提高系统的效率。?在单在单CPUCPU系统中系统中,一次只能执行一个线程,线程的运行一次只能执行一个线程,线程的运行顺序取决于其优级别。顺序取决于其优级别。?当线程到达优先队列的队头时,其代码流会执行长度当线程到达优先队列的队头时,其代码流会执行长度固定的一段时间,这段时间称为时间片固定的一段时间,这段时间称为时间片(Time Slice)(Time Slice)。如果在时间片内线程未完成执行,必须存储其状态信如果在时间片内线程未完成执行,必须存储其状态信息,以便下次执行时能从该断点处恢复执行。息,以便下次执行时能从该断点处恢复执行。?线
11、程的状态信息包括寄存器、栈指针和一个程序计数线程的状态信息包括寄存器、栈指针和一个程序计数器,程序计数器将告诉线程下一次执行哪个指令器,程序计数器将告诉线程下一次执行哪个指令.?所有这些信息都存放在分配给线程本地存储区所有这些信息都存放在分配给线程本地存储区(TLS)(TLS)的的内存区中内存区中.使用多线程的好处使用多线程的好处:使用线程的好处有以下几点:使用线程的好处有以下几点:?使用线程可以把占据长时间的程序中的任务放到后台使用线程可以把占据长时间的程序中的任务放到后台去处理去处理(比如比如WordWord的打印程序,调用打印机打印文档的打印程序,调用打印机打印文档是一个很耗时的任务是一
12、个很耗时的任务)?用户界面可以更加吸引人,这样比如用户点击了一个用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度显示处理的进度(比如拷贝大文件显示文件拷贝进度)比如拷贝大文件显示文件拷贝进度)?程序的运行速度可能加快程序的运行速度可能加快(比如分多个线程对集合进行比如分多个线程对集合进行排序排序)?增强程序的响应特性增强程序的响应特性(比如,当用浏览器下载一个文件比如,当用浏览器下载一个文件时间,若网络速度较慢,中途想停止,则需要另外使时间,若网络速度较慢,中途想停止,则需要另外使用一个线程
13、来终止下载过程)用一个线程来终止下载过程)使用多线程的使用多线程的缺点缺点缺点缺点:线程的缺点:线程的缺点:线程的缺点:线程的缺点:?每个线程都需要维护当前状态,如果有大量的线程,会每个线程都需要维护当前状态,如果有大量的线程,会影响性能,因为操作系统需要在他们之间切换;影响性能,因为操作系统需要在他们之间切换;?更多的线程需要更多的内存空间,便于维护状态信息;更多的线程需要更多的内存空间,便于维护状态信息;多线程程序比较复杂,可能会给程序带来更多的多线程程序比较复杂,可能会给程序带来更多的bugbug,因此要小心使用;因此要小心使用;?线程的中止需要考虑其对其他线程序运行的影响;线程的中止需
14、要考虑其对其他线程序运行的影响;?若有多个线程共享某些资源若有多个线程共享某些资源(比如内存单元,比如内存单元,I/OI/O操作等操作等),),线程之间会产生竞争和冲突,必须要考虑线程的同步问线程之间会产生竞争和冲突,必须要考虑线程的同步问题题线程的状态线程的状态线程的状态线程的状态:?UnstartedUnstarted(未启动态未启动态未启动态未启动态)?Where a thread starts lifecycleWhere a thread starts lifecycle?Remains here until Remains here until ThreadThread metho
15、d method StartStart is calledis called?Started(Started(就绪态就绪态就绪态就绪态)?Remains here until processor begins to run itRemains here until processor begins to run it?Running(Running(运行态运行态运行态运行态)?Highest priority Started thread enters running state firstHighest priority Started thread enters running state
16、 first?Begins execution when processor is assigned to threadBegins execution when processor is assigned to thread?ThreadStartThreadStart delegate specifies actions of threadsdelegate specifies actions of threads?Stopped(Stopped(停止态停止态停止态停止态)?Enters when delegate terminatesEnters when delegate termin
17、ates?Enters if program calls Enters if program calls ThreadThread method method AbortAbort线程的状态线程的状态线程的状态线程的状态:?Blocked:(Blocked:(阻塞态阻塞态阻塞态阻塞态)?Blocked when makes I/O requestBlocked when makes I/O request?Becomes unblocked when operating system completes Becomes unblocked when operating system compl
18、etes I/OI/O?WaitSleepJoinWaitSleepJoin(等待等待等待等待,休眠和连接态休眠和连接态休眠和连接态休眠和连接态)?Enters three ways:Enters three ways:?Thread calls Thread calls MonitorMonitor method method WaitWait because it encounters because it encounters code it cannot execute yetcode it cannot execute yet?Leaves when another thread c
19、alls Leaves when another thread calls PulsePulse?Calls Calls SleepSleep method to sleep for a specified timemethod to sleep for a specified time?Two threads are joined if one cannot execute until the other Two threads are joined if one cannot execute until the other terminatesterminates?Threads Wait
20、ing or Sleeping can come out of these Threads Waiting or Sleeping can come out of these states if the threads states if the threads InterruptInterrupt method is calledmethod is called?Suspended(Suspended(挂起态挂起态)?Enters when a threads Enters when a threads SuspendSuspend method is calledmethod is cal
21、led?Returns to Started state when Returns to Started state when ResumeResume method is method is invokedinvoked线程的生命循环线程的生命循环:WaitSleepJoinSuspendedStoppedBlockedUnstartedStartedRunningdispatch(assign a processor)ResumeStartInterruptPulsePulseAllsleep interval expiresquantum expirationSuspendWaitSle
22、ep,Joincompleteissue I/O requestI/O completion在在在在.NET.NET里如何使用多线程工作里如何使用多线程工作里如何使用多线程工作里如何使用多线程工作?.NET.NET下有六种主要使用多线程的方法下有六种主要使用多线程的方法:1.1.使用异步委托使用异步委托,来创建多线程来创建多线程2.2.使用使用ThreadThread类创建线程对象类创建线程对象3.3.使用使用MethodInvokerMethodInvoker方法创建简单线程对象方法创建简单线程对象4.4.直接使用直接使用FCLFCL中一些类的异步操作方法,比如中一些类的异步操作方法,比如I
23、OIO中中的的StreamStream类的类的BeginRead,BeginWriteBeginRead,BeginWrite等等5.5.使用线程池,如使用线程池,如:ThreadPool.QueueUserWorkItemThreadPool.QueueUserWorkItem6.6.使用定时器使用定时器TimerTimer1.1.使用异步委托使用异步委托,来创建多线程来创建多线程同步和异步两种技术的抽象描述:同步和异步两种技术的抽象描述:?在同步程序中,每个方法都是按照顺序执行的,在同步程序中,每个方法都是按照顺序执行的,?在异步程序中,方法在异步程序中,方法B B可以与方法可以与方法A
24、A和和C C同时运行同时运行同步处理:同步处理:同步处理:同步处理:启动启动ABC结束结束异步处理:异步处理:异步处理:异步处理:启动启动ABC结束结束主线程主线程工作线程工作线程1.1.使用异步委托使用异步委托,来创建多线程来创建多线程同时运行两个或者多个同时运行两个或者多个(多线程多线程)会带来一些会带来一些在单线程程序中不曾有的问题:在单线程程序中不曾有的问题:1.1.主线程和工作线程之间需要什么类型的通主线程和工作线程之间需要什么类型的通信?比如,工作线程中的代码可以一经调用被信?比如,工作线程中的代码可以一经调用被忘记,或者主线程可能必须知道工作线程的任忘记,或者主线程可能必须知道工
25、作线程的任务何时完成?务何时完成?2.2.主线程如何知道工作线程何时完成?对此,主线程如何知道工作线程何时完成?对此,可有两种办法:一种是回调可有两种办法:一种是回调(CallBackCallBack)技术,技术,一种是轮询一种是轮询(Poll)(Poll)技术技术3.3.如何使请求同一资源的线程同步?如何使请求同一资源的线程同步?4.4.在工作线程仍在执行时如何终止程序?在工作线程仍在执行时如何终止程序?同步委托示例同步委托示例/(1)/(1)声明一个委托声明一个委托MyDelegateMyDelegatePublic delegate double Public delegate doub
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第九 多线程 程序设计
限制150内