c#多线程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Hands-On实训教程系列第十五章多线程Hands-On实训教程系列回顾委托是一种引用方法的类型。委托的声明和使用单路广播委托和多路广播委托的概念函数签名与委托签名事件的声明与使用Hands-On实训教程系列目标理解线程的概念理解.NET中线程的属性和方法创建和使用线程理解线程的特点、优点及使用场合Hands-On实训教程系列同时执行所有任务,时间更少,效率更高人体线程简介3-1读,写一览无遗血液循环在同一时间点执行各项进程•编译程序•发送/接收邮件•打印文件•其他操作系统允许计算机同时执行多项操作程序(进程)Hands-On实训教程系列线程简介3-2程序1程序2线程1线程2线程3线程1线程2线程3单独的执行路径Hands-On实训教程系列线程简介3-3在以下情况中可能要使用到多线程:程序需要同时执行两个或多个任务程序要等待某事件的发生,例如用户输入、文件操作、网络操作、搜索等后台程序Hands-On实训教程系列线程及多线程工作原理线程表示计算机执行的指令序列。一个处理器在某一刻只能处理一个任务。如果有一个多处理器系统,理论上它可以同时执行多个指令——一个处理器执行一个指令,但大多数人使用的是单处理器计算机,这种情况是不可能同时发生的。而实际上,Windows操作系统表面上可以同时处理多个任务,这个过程称为抢先式多任务处理(pre-emptivemultitasking)。Hands-On实训教程系列抢先式多任务处理所谓抢先式多任务处理,是指Windows在某个进程中选择一个线程,该线程运行一小段时间。Microsoft没有说明这段时间有多长,因为为了获得最好的性能,Windows有一个内部操作系统参数来控制这个时间值。但在运行Windows应用程序时,用户不需要知道它。从我们的角度来看,这个时间非常短,肯定不会超过几毫秒。这段很短的时间称为线程的时间片(timeslice)。过了这个时间片后,Windows就收回控制权,选择下一个被分配了时间片的线程。这些时间片非常短,我们可以认为许多事件是同时发生的。Hands-On实训教程系列System.Threading命名空间2-1System.ObjectSystem.Threading.ThreadStateSystem.DelegateSystem.Threading.ThreadPrioritySystem.MulticastDelegateSystem.Threading.ThreadStartSystem.Threading.ThreadSystem.Threading.ThreadAbortExceptionSystem.ThreadStateExceptionSystem.SystemExceptionSystem.ExceptionSystem.EnumSystem.ValueTypeHands-On实训教程系列System.Threading命名空间2-2System.DelegateSystem.MulticastDelegateThreadStartSystem.ValueTypeSystem.EnumThreadPrioritySystem.ObjectSystem.ThreadingHands-On实训教程系列创建及启动线程引用System.Threading命名空间Thread线程实例名=newThread(newThreadStart(方法名));运行在线程上的方法只创建但不启动线程线程实例名.Start();Hands-On实训教程系列示例classSimpleThreadDemo{staticvoidMain(string[]args){Thread.CurrentThread.Name=“主线程;ThreadobjThread=newThread(newThreadStart(ActionMethod));objThread.Name=“子线程;//启动子线程,并为该线程执行ActionMethodobjThread.Start();//这将为主线程执行ActionMethodActionMethod();}staticvoidActionMethod(){for(intcount=1;count=10;count++){Console.WriteLine(“线程名:+Thread.CurrentThread.Name);}}}实例化objThread线程并开始执行ActionMethod()将由应用程序线程执行输出结果混乱演示示例1SimpleThreadDemoHands-On实训教程系列线程状态Hands-On实训教程系列Thread类的属性属性属性CurrentThread获取当前正在运行的线程。IsAlive获取一个值,该值指示当前线程的执行状态。Name获取或设置线程的名称。Priority获取或设置一个值,该值指示线程的调度优先级。ThreadState获取一个值,该值包含当前线程的状态。Hands-On实训教程系列Thread状态成员名称说明Aborted线程处于Stopped状态中。AbortRequested已对线程调用了Thread.Abort方法,但线程尚未收到试图终止它的挂起的System.Threading.ThreadAbortException。Background线程正作为后台线程执行(相对于前台线程而言)。此状态可以通过设置Thread.IsBackground属性来控制。Running线程已启动,它未被阻塞,并且没有挂起的ThreadAbortException。Stopped线程已停止。StopRequested正在请求线程停止。这仅用于内部。Suspended线程已挂起。SuspendRequested正在请求线程挂起。Unstarted尚未对线程调用Thread.Start方法。WaitSleepJoin由于调用Wait、Sleep或Join,线程已被阻止。Hands-On实训教程系列Thread类的方法方法方法Sleep()将当前线程阻止指定的毫秒数。Abort()调用此方法通常会终止线程。Join()阻止调用线程,直到某个线程终止时为止。Resume()继续已挂起的线程。Start()使线程被安排进行执行。Suspend()挂起线程,或者如果线程已挂起,则不起作用。Hands-On实训教程系列线程的生命周期等待/休眠/加入已暂停正在运行已停止未开始已开始已阻止暂停发送I/O请求等待,休眠,加入开始I/O完成完成恢复在I/O操作期间线程被阻止线程已创建但并未启动线程已启动I/O操作完成后运行线程被阻止,另一个操作正在进行提前中断或特地停止线程暂时中断的线程线程已恢复演示示例2ThreadJoinDemoHands-On实训教程系列先执行哪个线程?调度线程2-1程序1程序2线程1线程2线程3线程1线程2线程3如果在应用程序中有多个线程在运行,但一些线程比另一些线程重要,该怎么办?可以在一个进程中为不同的线程指定不同的优先级Hands-On实训教程系列调度线程2-2ThreadPriority枚举成员说明AboveNormal安排在优先级为Highest(最高)的线程之后,以及优先级为Normal(普通)的线程之前。BelowNormal安排在优先级为Normal(普通)的线程之后,以及优先级为Lowest(最低)的线程之前。Highest安排在任何其他优先级的线程之前。Lowest安排在任何其他优先级的线程之后。Normal安排在优先级为AboveNormal的线程之后,以及在优先级为BelowNormal的线程之前。默认情况下,线程的优先级为Normal(普通)。演示示例3ThreadPriorityDemoHands-On实训教程系列示例staticvoidTaskTwo(){for(intindex=5000;index=4990;index--){Console.WriteLine(index);}}staticvoidMain(string[]args){ThreadobjThreadOne=newThread(newThreadStart(TaskOne));ThreadobjThreadTwo=newThread(newThreadStart(TaskTwo));objThreadOne.Start();objThreadTwo.Start();}staticvoidTaskOne(){for(intcount=1;count=5;count++){Console.WriteLine(count*2);}}无优先级线程,同时执行,输出无序….Hands-On实训教程系列示例staticvoidMain(string[]args){Thread.CurrentThread.Name=“主线程;ThreadobjThreadOne=newThread(newThreadStart(TaskOne));objThreadOne.Name=“子线程1;ThreadobjThreadTwo=newThread(newThreadStart(TaskTwo));objThreadTwo.Name=“子线程2;//这将启动子线程objThreadOne.Start();objThreadTwo.Start();objThreadTwo.Priority=ThreadPriority.Highest;}将在执行第一个线程前执行objThreadTwoHands-On实训教程系列线程同步使用线程的一个重要方面是同步访问多个线程访问的任何变量。所谓同步,是指在某一时刻只有一个线程可以访问变量。如果不能确保对变量的访问是同步的,就会产生错误。Hands-On实训教程系列锁定机制程序线程1线程2共享资源锁定机制保证每次只有一个线程可以访问共享资源缓冲和隔离Hands-On实训教程系列同步关键字-lockC#为同步访问变量提供了一个非常简单的方式,即使用C#语言的关键字lock,其用法如下所示:lock(x){DoSomething();}Hands-On实训教程系列同步示例3-1在书店可能某种书籍只有一本,而两个售货员同时销售这本书,我们可以把两个售货员看作两个线程,那该如何处理呢?演示示例4LockDemoHands-On实训教程系列同步示例3-2classBookShop{publicstaticintcount=1;publicvoidSale(){lock(this){if(count0){count=count-1;Thread.Sleep(1000);Console.WriteLine({0}卖出去了一本,现在还剩下{1}本,Thread.CurrentThread.Name,count);}else{Console.WriteLine({0}说:对不起,卖完了,Thread.CurrentThread.Name);}}}}Hands-On实训教程系列同步示例3-3classProgram{staticvoidMain(string[]args){BookShopbookShop=newBookShop();Threadt1=newThread(newThreadStart(bookShop.Sale));Threadt2=newThread(newThreadStart(bookShop.Sale));t1.Name=小赵;t2.Name=小张;t1.Start();t2.Start();}}Hands-On实训教程系列同步注意问题不要滥用同步死锁演示示例5DeadLockDemoHands-On实训教程系列线程安全性线程安全性就是保护类的成员和代码的安全,从而使它们不会同时被几个线程中断如果类中的成员和代码受到保护而不会被几个线程中断,则这个类称为线程安全的类voidDoTask(){lock(this)...{...}

1 / 33
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功