创建多线程程序PPT课件

上传人:汽*** 文档编号:592832976 上传时间:2024-09-22 格式:PPT 页数:47 大小:548.50KB
返回 下载 相关 举报
创建多线程程序PPT课件_第1页
第1页 / 共47页
创建多线程程序PPT课件_第2页
第2页 / 共47页
创建多线程程序PPT课件_第3页
第3页 / 共47页
创建多线程程序PPT课件_第4页
第4页 / 共47页
创建多线程程序PPT课件_第5页
第5页 / 共47页
点击查看更多>>
资源描述

《创建多线程程序PPT课件》由会员分享,可在线阅读,更多相关《创建多线程程序PPT课件(47页珍藏版)》请在金锄头文库上搜索。

1、第十一章第十一章 创建多线程程序创建多线程程序沈项军沈项军计算机科学与通信工程学院计算机科学与通信工程学院1内容提要内容提要n实现线程实现线程n定义线程的生命周期定义线程的生命周期n实现多线程实现多线程n识别线程的优先级识别线程的优先级n在线程中使用同步在线程中使用同步n识别进程间的通信识别进程间的通信2同时执行所有任务,时间更少,效率更高线程简介线程简介在同一时间点执行各项进程 编译程序 发送/接收邮件 打印文件 其他操作系统允许计算机同时执行多项操作程序(进程)3线程简介线程简介程序 1 程序 2线程 1线程 2线程 3线程 1线程 2线程 3单独的执行路径4进程和线程进程和线程 n进程是

2、程序的一次执行进程是程序的一次执行n一个或多个线程构成一个进程一个或多个线程构成一个进程进程进程线程5线程简介线程简介在以下情况中可能要使用到多线程: l程序需要同时执行两个或多个任务l程序要等待某事件的发生,例如用户输入、文件操作、网络操作、搜索等l后台程序6线程及多线程工作原理线程及多线程工作原理n线程表示计算机执行的指令序列。线程表示计算机执行的指令序列。n一个处理器在某一刻只能处理一个任务。如果有一一个处理器在某一刻只能处理一个任务。如果有一个多处理器系统,理论上它可以同时执行多个指令个多处理器系统,理论上它可以同时执行多个指令一个处理器执行一个指令,但大多数人使用的一个处理器执行一个

3、指令,但大多数人使用的是单处理器计算机,这种情况是不可能同时发生的。是单处理器计算机,这种情况是不可能同时发生的。而实际上,而实际上,WindowsWindows操作系统表面上可以同时处理操作系统表面上可以同时处理多个任务,这个过程称为抢先式多任务处理(多个任务,这个过程称为抢先式多任务处理(pre-pre-emptive multitaskingemptive multitasking)。)。7抢先式多任务处理抢先式多任务处理n所谓抢先式多任务处理,是指所谓抢先式多任务处理,是指WindowsWindows在某个进程中选择一在某个进程中选择一个线程,该线程运行一小段时间。个线程,该线程运行一

4、小段时间。MicrosoftMicrosoft没有说明这段时没有说明这段时间有多长,因为为了获得最好的性能,间有多长,因为为了获得最好的性能,WindowsWindows有一个内部有一个内部操作系统参数来控制这个时间值。但在运行操作系统参数来控制这个时间值。但在运行WindowsWindows应用程应用程序时,用户不需要知道它。从我们的角度来看,这个时间非序时,用户不需要知道它。从我们的角度来看,这个时间非常短,肯定不会超过几毫秒。这段很短的时间称为线程的时常短,肯定不会超过几毫秒。这段很短的时间称为线程的时间片(间片(time slicetime slice)。过了这个时间片后,)。过了这个

5、时间片后,WindowsWindows就收回控就收回控制权,选择下一个被分配了时间片的线程。这些时间片非常制权,选择下一个被分配了时间片的线程。这些时间片非常短,我们可以认为许多事件是同时发生的。短,我们可以认为许多事件是同时发生的。 8实现线程实现线程n线程被用来运行完成大型和复杂计算的程序。线程被用来运行完成大型和复杂计算的程序。n使用一个线程执行的进程被称为单线程进程,这里使用一个线程执行的进程被称为单线程进程,这里进程是一个程序的运行实例。进程是一个程序的运行实例。n单线程程序一次仅可以完成一个任务。在另一个任单线程程序一次仅可以完成一个任务。在另一个任务开始之前,你必须等待一个任务完

6、成。务开始之前,你必须等待一个任务完成。9实现线程实现线程n下图显示了单线程进程。下图显示了单线程进程。n为了一次执行多于一个任务,你可以在程序中创建为了一次执行多于一个任务,你可以在程序中创建多个线程。多个线程。n创建两个或更多线程的进程被称为多线程进程。创建两个或更多线程的进程被称为多线程进程。10C#C#中的线程模型中的线程模型n在单线程模型中,程序使用轮询来调用事件循环。在单线程模型中,程序使用轮询来调用事件循环。n轮询是一个进程,在其中一次执行一个单一的事件。轮询是一个进程,在其中一次执行一个单一的事件。n在带有轮询方法的事件循环中,单一线程以无限循在带有轮询方法的事件循环中,单一线

7、程以无限循环的方式运行直到它的操作完成。环的方式运行直到它的操作完成。n在单线程程序中,如果线程从执行被挂起因为它正在单线程程序中,如果线程从执行被挂起因为它正在等待一个系统资源,整个程序停止执行。在等待一个系统资源,整个程序停止执行。n在多线程中,一个线程等待的在多线程中,一个线程等待的CPUCPU时间可以被用来时间可以被用来完成另一个任务。完成另一个任务。11C#C#中的线程模型中的线程模型n在在CLRCLR中有两种线程中有两种线程n代表托管线程代表托管线程n代表代表OSOS线程线程using System;using System;class HelloWorld class Hello

8、World static void Main() static void Main() (Hello, World); (Hello, World); ();(); 12主线程主线程n主线程在主线程在C#C#程序开始执行的时候被自动创建。程序开始执行的时候被自动创建。n使用使用ThreadThread类被排他创建的线程被称为子线程,其类被排他创建的线程被称为子线程,其中主线程被称为父线程或者基本线程。中主线程被称为父线程或者基本线程。n你可以使用你可以使用ThreadThread类的类的CurrentThreadCurrentThread属性来访问属性来访问线程。线程。13使用线程使用线程n在

9、在C#C#中,通过中,通过ThreadStartThreadStart创建线程调用方法的引用,并将该创建线程调用方法的引用,并将该引用通过创建一个引用通过创建一个ThreadThread类型的对象创建一个线程,接着调类型的对象创建一个线程,接着调用新线程的用新线程的Start()Start()方法启动线程。方法启动线程。ThreadStart ChildRef = new ThreadStart(ChildThreadCall);ThreadStart ChildRef = new ThreadStart(ChildThreadCall);Thread ChildThread = new Th

10、read(ChildRef);Thread ChildThread = new Thread(ChildRef);();();引用 命名空间Thread 线程实例名 = new Thread(new ThreadStart(方法名);只创建但不启动线程只创建但不启动线程线程实例名.Start();启动线程启动线程14使用线程使用线程n新线程开始异步执行线程的方法调用。新线程开始异步执行线程的方法调用。n线程的处理线程的处理n启动线程(启动线程(StartStart方法)方法)n挂起线程(挂起线程(SuspendSuspend方法)方法)n挂起不会立即生效挂起不会立即生效n恢复被刮起的线程(恢复

11、被刮起的线程(ResumeResume方法)方法) n恢复不会立即生效恢复不会立即生效n终止线程(终止线程(AbortAbort方法)方法)n线程的休眠(线程的休眠(SleepSleep方法)方法)15管理线程管理线程n有许多你可能需要完成的任务来管理线程的活动或有许多你可能需要完成的任务来管理线程的活动或生命。生命。n可以通过使用可以通过使用ThreadThread类的各种可用线程方法来管理类的各种可用线程方法来管理这些任务。这些任务。n() ()静态方法调用静态静态方法调用静态CurrentThreadCurrentThread方法,然后它方法,然后它在指定的时间内暂停线程。在指定的时间内

12、暂停线程。16管理线程管理线程n临时挂起会话进程(用户通常不会这么做,但这仅是一个示例,临时挂起会话进程(用户通常不会这么做,但这仅是一个示例,在更真实的示例中,用户可能是暂停声音文件或视频文件的在更真实的示例中,用户可能是暂停声音文件或视频文件的播放)播放) 。n在主线程中编写如下代码,挂起该线程:在主线程中编写如下代码,挂起该线程:depthChangeThreaddepthChangeThread.Suspend();Suspend();n如果需要恢复该线程,可以使用下面的方法:如果需要恢复该线程,可以使用下面的方法:depthChangeThreaddepthChangeThread.

13、Resume();Resume();n如需要退出该线程如需要退出该线程depthChangeThreaddepthChangeThread.Abort();Abort();17线程使用示例线程使用示例using System;using System;using System.Threading;using System.Threading;class BasicThreadAppclass BasicThreadApp public static void ChildThreadCall() public static void ChildThreadCall() try try Conso

14、le.WriteLine(Child thread started); Console.WriteLine(Child thread started); Console.WriteLine(Child thread - counting to 10); Console.WriteLine(Child thread - counting to 10); for (int i = 0; i 10; i+) for (int i = 0; i 10; i+) Thread.Sleep(500); Thread.Sleep(500); Console.Write(0., i); Console.Wri

15、te(0., i); Console.WriteLine(Child thread finished); Console.WriteLine(Child thread finished); catch (ThreadAbortException e) catch (ThreadAbortException e) Console.WriteLine(Exception has caught); Console.WriteLine(Exception has caught); finally finally Console.WriteLine(Child Thread - unable to be

16、 finished); Console.WriteLine(Child Thread - unable to be finished); public static void Main() ThreadStart ChildRef = new ThreadStart(ChildThreadCall); Console.WriteLine(Main - Creating Child Thread); Thread ChildThread = new Thread(ChildRef); ChildThread.Start(); Console.WriteLine(Main - Sleeping f

17、or 2 seconds); Thread.Sleep(2000); Console.WriteLine(n Main - Aborting child thread); ChildThread.Abort(); Console.ReadLine(); 18线程生命周期线程生命周期n当类的对象被创建的时候,线程的生命周期开始。当类的对象被创建的时候,线程的生命周期开始。线程的生命周期结束于任务的执行。线程的生命周期结束于任务的执行。n在线程的生命周期中有各种状态。这些状态是:在线程的生命周期中有各种状态。这些状态是:n未启动状态未启动状态n运行态运行态n未运行态未运行态n死亡态死亡态19未启动

18、状态未启动状态n当一个当一个ThreadThread类的实例被创建的时候,线程进入未类的实例被创建的时候,线程进入未启动状态。启动状态。n新线程是新线程是ThreadThread类的一个空对象,没有系统资源例类的一个空对象,没有系统资源例如内存被分配给它。如内存被分配给它。20运行态运行态n线程一直处在未启动状态直到程序调用线程一直处在未启动状态直到程序调用ThreadThread类的类的StartStart() ()方法,它将线程置于运行态,并且立即返回控制到方法,它将线程置于运行态,并且立即返回控制到调用的线程。调用的线程。n这个状态也被称为准备或启动状态。这个状态也被称为准备或启动状态。

19、n新启动的线程和程序中任何其它线程同时执行。新启动的线程和程序中任何其它线程同时执行。21Start()StartedWork CompletedStopped线程生命周期线程生命周期22未运行态未运行态n如果它处于下面的状态,那么线程处于未运行态如果它处于下面的状态,那么线程处于未运行态n休眠休眠n等待等待n阻塞阻塞23Start()StartedSuspend()SuspendedResume()线程生命周期线程生命周期24Start()StartedSleep()Wait/JoinSleepInterrupt()Time Expires线程生命周期线程生命周期25死亡状态死亡状态n当线程

20、方法的语句完成的时候,运行线程进入死亡当线程方法的语句完成的时候,运行线程进入死亡状态。这个状态也被称为终结态。状态。这个状态也被称为终结态。n程序可以通过在适当的线程对象上调用程序可以通过在适当的线程对象上调用ThreadThread类的类的AbortAbort() ()方法来强迫线程进入死亡态。方法来强迫线程进入死亡态。26Start()StartedAbort()Stop RequestThread Responds to Stop RequestStopped线程生命周期线程生命周期27介绍多线程介绍多线程 n多线程有助于同时完成各种操作,节省用户的时间。多线程有助于同时完成各种操作,

21、节省用户的时间。n多线程允许你在一个程序中完成多个任务。多线程允许你在一个程序中完成多个任务。n多任务是同时执行多个任务的能力。多任务是同时执行多个任务的能力。n多任务可以被分成如下类型:多任务可以被分成如下类型:n基于进程的多任务基于进程的多任务 n基于线程的多任务基于线程的多任务 该女士在同时吃苹果、看书该女士在同时吃苹果、看书并在电脑上工作。并在电脑上工作。28多线程的优点和限制多线程的优点和限制n多线程的优点有:多线程的优点有:n改进性能改进性能 n最小化系统资源最小化系统资源 n同时访问多个程序同时访问多个程序 n程序结构简化程序结构简化 n多线程的限制有:多线程的限制有:n竞态情况

22、竞态情况同时读写同一个变量同时读写同一个变量n死锁情况死锁情况互相等待对方释放所需资源互相等待对方释放所需资源n饥饿锁饥饿锁低优先级的线程无限等待低优先级的线程无限等待29创建多线程示例创建多线程示例using System;using System;using System.Threading;using System.Threading;class ThreadScheduleclass ThreadSchedule public static void ChildThread1() public static void ChildThread1() Console.WriteLine(C

23、hild thread 1 started); Console.WriteLine(Child thread 1 started); Console.WriteLine(Child thread - counting from 1 to 10); Console.WriteLine(Child thread - counting from 1 to 10); for (int T = 1; T 11; T+) for (int T = 1; T 11; T+) for (int Cnt = 0; Cnt 100; Cnt+) for (int Cnt = 0; Cnt 100; Cnt+) C

24、onsole.Write(.); Console.Write(.); Console.Write(0, T); Console.Write(0, T); Console.WriteLine(Child thread 1 finished); Console.WriteLine(Child thread 1 finished); public static void ChildThread2() public static void ChildThread2() Console.WriteLine(Child thread 2 started); Console.WriteLine(Child

25、thread 2 started); Console.WriteLine(Child thread - counting slowly from 11 to 20); Console.WriteLine(Child thread - counting slowly from 11 to 20); for (int T = 11; T 21; T+) for (int T = 11; T 21; T+) for (int Cnt = 0; Cnt 100; Cnt+) for (int Cnt = 0; Cnt 0) /卖书过程程 Thread.Sleep(1000); num = num -

26、1; (售出一本售出一本); else (没有了没有了); public class MyClasspublic class MyClass public static void Main() public static void Main() BookShop a = new BookShop(); BookShop a = new BookShop(); Thread t1 = new Thread(new ThreadStart Thread t1 = new Thread(new ThreadStart(a(a.Sale); Sale); Thread t2 = new Thread(

27、new ThreadStart Thread t2 = new Thread(new ThreadStart(a(a.Sale); Sale); t1 t1.Start();Start(); t2 t2.Start();Start(); Console Console.Read();Read(); 42同步注意问题同步注意问题n不要滥用同步不要滥用同步 n死锁死锁 n竞态条件竞态条件 43识别进程间的通信识别进程间的通信n进程是程序的一个运行实例。进程是程序的一个运行实例。 n运行时在同一计算机内或通过网络的进程间的通信运行时在同一计算机内或通过网络的进程间的通信被称为进程间通信。被称为进程间

28、通信。n为了允许进程间通信,使用特殊技术和机制。为了允许进程间通信,使用特殊技术和机制。44程序域程序域n在在.NET.NET中,线程在程序域中执行。在一个进程中的线中,线程在程序域中执行。在一个进程中的线程不能调用属于另一个进程中的线程的方法。程不能调用属于另一个进程中的线程的方法。n但是,在但是,在.NET.NET中,线程可以通过程序域的边界,在一中,线程可以通过程序域的边界,在一个线程的方法可以调用另一个程序域的方法。个线程的方法可以调用另一个程序域的方法。n程序域是物理进程内的逻辑进程。程序域是物理进程内的逻辑进程。45程序域程序域n程序域的主要目的是从其他程序中隔离你的程序。程序域的主要目的是从其他程序中隔离你的程序。n程序域在单个进程运行。程序域在单个进程运行。n使用类来管理程序域。使用类来管理程序域。46作业作业n练习练习1 147

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号