《创建多线程程序.pptx》由会员分享,可在线阅读,更多相关《创建多线程程序.pptx(47页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1内容提要内容提要实现线程定义线程的生命周期实现多线程识别线程的优先级在线程中使用同步识别进程间的通信第1页/共47页2同时执行所有任务,时间更少,效率更高线程简介线程简介在同一时间点执行各项进程 编译程序 发送/接收邮件 打印文件 其他操作系统允许计算机同时执行多项操作程序(进程)第2页/共47页3线程简介线程简介程序 1 程序 2线程 1线程 2线程 3线程 1线程 2线程 3单独的执行路径第3页/共47页4进程和线程进程和线程 n进程是程序的一次执行进程是程序的一次执行n一个或多个线程构成一个进程一个或多个线程构成一个进程进程进程线程第4页/共47页5线程简介线程简介在以下情况中可能要使
2、用到多线程:l程序需要同时执行两个或多个任务l程序要等待某事件的发生,例如用户输入、文件操作、网络操作、搜索等l后台程序第5页/共47页6线程及多线程工作原理线程及多线程工作原理线程表示计算机执行的指令序列。一个处理器在某一刻只能处理一个任务。如果有一个多处理器系统,理论上它可以同时执行多个指令一个处理器执行一个指令,但大多数人使用的是单处理器计算机,这种情况是不可能同时发生的。而实际上,Windows操作系统表面上可以同时处理多个任务,这个过程称为抢先式多任务处理(pre-emptive multitasking)。第6页/共47页7抢先式多任务处理抢先式多任务处理所谓抢先式多任务处理,是指
3、Windows在某个进程中选择一个线程,该线程运行一小段时间。Microsoft没有说明这段时间有多长,因为为了获得最好的性能,Windows有一个内部操作系统参数来控制这个时间值。但在运行Windows应用程序时,用户不需要知道它。从我们的角度来看,这个时间非常短,肯定不会超过几毫秒。这段很短的时间称为线程的时间片(time slice)。过了这个时间片后,Windows就收回控制权,选择下一个被分配了时间片的线程。这些时间片非常短,我们可以认为许多事件是同时发生的。第7页/共47页8实现线程实现线程线程被用来运行完成大型和复杂计算的程序。使用一个线程执行的进程被称为单线程进程,这里进程是一
4、个程序的运行实例。单线程程序一次仅可以完成一个任务。在另一个任务开始之前,你必须等待一个任务完成。第8页/共47页9实现线程实现线程下图显示了单线程进程。为了一次执行多于一个任务,你可以在程序中创建多个线程。创建两个或更多线程的进程被称为多线程进程。第9页/共47页10C#中的线程模型中的线程模型在单线程模型中,程序使用轮询来调用事件循环。轮询是一个进程,在其中一次执行一个单一的事件。在带有轮询方法的事件循环中,单一线程以无限循环的方式运行直到它的操作完成。在单线程程序中,如果线程从执行被挂起因为它正在等待一个系统资源,整个程序停止执行。在多线程中,一个线程等待的CPU时间可以被用来完成另一个
5、任务。第10页/共47页11C#中的线程模型中的线程模型在CLR中有两种线程System.Threading.Thread代表托管线程System.Diagonostics.ProcessThread代表OS线程using System;class HelloWorld static void Main()Console.WriteLine(Hello,World);Console.ReadLine();第11页/共47页12主线程主线程主线程在C#程序开始执行的时候被自动创建。使用Thread类被排他创建的线程被称为子线程,其中主线程被称为父线程或者基本线程。你可以使用Thread类的Cur
6、rentThread属性来访问线程。第12页/共47页13使用线程使用线程在C#中,通过ThreadStart创建线程调用方法的引用,并将该引用通过创建一个Thread类型的对象创建一个线程,接着调用新线程的Start()方法启动线程。ThreadStart ChildRef=new ThreadStart(ChildThreadCall);Thread ChildThread=new Thread(ChildRef);ChildThread.Start();引用System.Threading 命名空间Thread 线程实例名=new Thread(new ThreadStart(方法名);
7、只创建但不启动线程只创建但不启动线程线程实例名.Start();启动线程启动线程第13页/共47页14使用线程使用线程新线程开始异步执行线程的方法调用。线程的处理启动线程(Start方法)挂起线程(Suspend方法)挂起不会立即生效恢复被刮起的线程(Resume方法)恢复不会立即生效终止线程(Abort方法)线程的休眠(Sleep方法)第14页/共47页15管理线程管理线程有许多你可能需要完成的任务来管理线程的活动或生命。可以通过使用Thread类的各种可用线程方法来管理这些任务。Thread.Sleep()静态方法调用静态CurrentThread方法,然后它在指定的时间内暂停线程。第15
8、页/共47页16管理线程管理线程临时挂起会话进程(用户通常不会这么做,但这仅是一个示例,在更真实的示例中,用户可能是暂停声音文件或视频文件的播放)。在主线程中编写如下代码,挂起该线程:depthChangeThread.Suspend();如果需要恢复该线程,可以使用下面的方法:depthChangeThread.Resume();如需要退出该线程depthChangeThread.Abort();第16页/共47页17线程使用示例线程使用示例using System;using System.Threading;class BasicThreadApp public static void
9、ChildThreadCall()try Console.WriteLine(Child thread started);Console.WriteLine(Child thread-counting to 10);for(int i=0;i 10;i+)Thread.Sleep(500);Console.Write(0.,i);Console.WriteLine(Child thread finished);catch(ThreadAbortException e)Console.WriteLine(Exception has caught);finally Console.WriteLin
10、e(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 for 2 seconds);Thread.Sleep(2000);Console.Wri
11、teLine(n Main-Aborting child thread);ChildThread.Abort();Console.ReadLine();第17页/共47页18线程生命周期线程生命周期当System.Threading.Thread类的对象被创建的时候,线程的生命周期开始。线程的生命周期结束于任务的执行。在线程的生命周期中有各种状态。这些状态是:未启动状态运行态未运行态死亡态第18页/共47页19未启动状态未启动状态当一个Thread类的实例被创建的时候,线程进入未启动状态。新线程是Thread类的一个空对象,没有系统资源例如内存被分配给它。第19页/共47页20运行态运行态线程
12、一直处在未启动状态直到程序调用Thread类的Start()方法,它将线程置于运行态,并且立即返回控制到调用的线程。这个状态也被称为准备或启动状态。新启动的线程和程序中任何其它线程同时执行。第20页/共47页21Start()StartedWork CompletedStopped线程生命周期线程生命周期第21页/共47页22未运行态未运行态如果它处于下面的状态,那么线程处于未运行态休眠等待阻塞第22页/共47页23Start()StartedSuspend()SuspendedResume()线程生命周期线程生命周期第23页/共47页24Start()StartedSleep()Wait/J
13、oinSleepInterrupt()Time Expires线程生命周期线程生命周期第24页/共47页25死亡状态死亡状态当线程方法的语句完成的时候,运行线程进入死亡状态。这个状态也被称为终结态。程序可以通过在适当的线程对象上调用Thread类的Abort()方法来强迫线程进入死亡态。第25页/共47页26Start()StartedAbort()Stop RequestThread Responds to Stop RequestStopped线程生命周期线程生命周期第26页/共47页27介绍多线程介绍多线程 多线程有助于同时完成各种操作,节省用户的时间。多线程允许你在一个程序中完成多个任
14、务。多任务是同时执行多个任务的能力。多任务可以被分成如下类型:基于进程的多任务 基于线程的多任务 该女士在同时吃苹果、看书该女士在同时吃苹果、看书并在电脑上工作。并在电脑上工作。第27页/共47页28多线程的优点和限制多线程的优点和限制多线程的优点有:改进性能 最小化系统资源 同时访问多个程序 程序结构简化 多线程的限制有:竞态情况同时读写同一个变量死锁情况互相等待对方释放所需资源饥饿锁低优先级的线程无限等待第28页/共47页29创建多线程示例创建多线程示例using System;using System.Threading;class ThreadSchedule public stati
15、c void ChildThread1()Console.WriteLine(Child thread 1 started);Console.WriteLine(Child thread-counting from 1 to 10);for(int T=1;T 11;T+)for(int Cnt=0;Cnt 100;Cnt+)Console.Write(.);Console.Write(0,T);Console.WriteLine(Child thread 1 finished);public static void ChildThread2()Console.WriteLine(Child
16、thread 2 started);Console.WriteLine(Child thread-counting slowly from 11 to 20);for(int T=11;T 21;T+)for(int Cnt=0;Cnt 0)/卖书过程 Thread.Sleep(1000);num=num-1;Console.WriteLine(售出一本);else Console.WriteLine(没有了);public class MyClass public static void Main()BookShop a=new BookShop();Thread t1=new Thread
17、(new ThreadStart(a.Sale);Thread t2=new Thread(new ThreadStart(a.Sale);t1.Start();t2.Start();Console.Read();第41页/共47页42同步注意问题同步注意问题不要滥用同步 死锁 竞态条件 第42页/共47页43识别进程间的通信识别进程间的通信进程是程序的一个运行实例。运行时在同一计算机内或通过网络的进程间的通信被称为进程间通信。为了允许进程间通信,使用特殊技术和机制。第43页/共47页44程序域程序域在.NET中,线程在程序域中执行。在一个进程中的线程不能调用属于另一个进程中的线程的方法。但是,在.NET中,线程可以通过程序域的边界,在一个线程的方法可以调用另一个程序域的方法。程序域是物理进程内的逻辑进程。第44页/共47页45程序域程序域程序域的主要目的是从其他程序中隔离你的程序。程序域在单个进程运行。使用System.AppDomain类来管理程序域。第45页/共47页46作业作业练习1第46页/共47页47谢谢您的观看!第47页/共47页