《C__WinForm实践开发教程》chp5.多线程编程技术

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

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

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

资源描述

--------------基于C#语言主讲教师:钱哨本课学时:72课时联系方式:qianshao@bjjtxy.bj.cnWindows程序设计第五章、多线程编程技术本章主要内容介绍5.1计算机线程介绍5.2System.Threading简介5.3线程的优先级与锁技术CONTENT本章学习目标:•理解线程的概念•理解.NET中线程的属性和方法•创建和使用线程•理解线程的特点、优点及使用场合同时执行所有任务,时间更少,效率更高人体5.1线程简介读,写一览无遗血液循环在同一时间点执行各项进程•编译程序•发送/接收邮件•打印文件•其他操作系统允许计算机同时执行多项操作程序(进程)5.1线程简介程序1程序2线程1线程2线程3线程1线程2线程3单独的执行路径5.1线程简介•进程:是应用程序的一个运行例程,是应用程序的一次动态执行过程。•线程:是进程中的一个执行单元;是操作系统分配CPU时间的基本单元。Windows是一个支持多线程的系统。一个进程可以包含若干个线程。5.1线程简介在以下情况中可能要使用到多线程:程序需要同时执行两个或多个任务程序要等待某事件的发生,例如用户输入、文件操作、网络操作、搜索等后台程序5.1线程简介•多线程:在同一时间执行多个任务的功能,称为多线程或自由线程。•多线程的优点:可以同时完成多个任务;可以使程序的响应速度更快;可以让占用大量处理时间的任务或当前没有进行处理的任务定期将处理时间让给别的任务;可以随时停止任务;可以设置每个任务的优先级以优化程序性能。•多线程的缺点:对资源的共享访问可能造成冲突(对共享资源的访问进行同步或控制);程序的整体运行速度减慢等等。在C#应用程序中,第一个线程总是Main()方法,因为第一个线程是由.NET运行库开始执行的,Main()方法是.NET运行库选择的第一个方法。后续的线程由应用程序在内部启动,即应用程序可以创建和启动新的线程。5.2System.Threading命名空间System.ObjectSystem.Threading.ThreadStateSystem.DelegateSystem.Threading.ThreadPrioritySystem.MulticastDelegateSystem.Threading.ThreadStartSystem.Threading.ThreadSystem.Threading.ThreadAbortExceptionSystem.ThreadStateExceptionSystem.SystemExceptionSystem.ExceptionSystem.EnumSystem.ValueType5.2System.Threading命名空间•在.NET程序设计中,线程是使用Thread类(或Timer类(线程计数器)、ThreadPool类(线程池))来处理的,这些类在System.Threading命名空间中:usingSystem.Threading;•Thread类:(实现线程的主要方法)一个Thread实例管理一个线程,即执行序列。通过简单实例化一个Thread对象,就可以创建一个线程,然后通过Thread对象提供的方法对线程进行管理。•Timer类:适用于间隔性的完成任务。•ThreadPool类:适用于多个小的线程。1、Thread类的属性和方法引用System.Threading命名空间Thread线程实例名=newThread(newThreadStart(方法名));运行在线程上的方法只创建但不启动线程线程实例名.Start();1、Thread类的属性和方法属性CurrentThread获取当前正在运行的线程IsAlive指示当前线程的执行状态Name获取或设置线程的名称Priority获取或设置线程的优先级CurrentContext获取线程其中执行的当前上下文IsBackground指示线程是否为后台线程ThreadState获取或设置线程的当前状态方法Sleep()将当前线程阻塞指定的毫秒数Abort()终止线程Join()阻塞调用线程,直到某个线程终止时为止Resume()继续已挂起的线程Start()启动线程Suspend()挂起线程GetDomain返回当前线程正在其中运行的当前域Interrupt中断处于WaitSleepJoin线程状态的线程ResetAbort取消为当前线程请求的Abort2、线程的生命周期在I/O操作期间线程被阻止线程已创建但并未启动线程已启动I/O操作完成后运行线程被阻止,另一个操作正在进行提前中断或特地停止线程暂时中断的线程线程已恢复等待/休眠/加入已暂停正在运行已停止未开始已开始已阻止暂停发送I/O请求等待,休眠,加入开始I/O完成完成恢复5.3线程的建立与启动新建一个线程的过程:只需将其声明并为其提供线程起始点处的方法委托,再用Thread.Start()方法启动该线程(1)声明:Threada;(2)实例化a=newThread(newThreadStart(b));其中,b为新建过程中执行的过程名。(3)调用Thread.Start()方法启动该线程a.Start();5.3线程的建立与启动usingSystem;usingSystem.Threading;publicclassA{publicvoidff()//线程启动时调用此方法{Console.WriteLine(A.ff()方法在另一个线程上运行!!);Thread.Sleep(3000);//将线程阻塞一定时间Console.WriteLine(终止工作线程调用此实例方法!!);}publicstaticvoidgg(){Console.WriteLine(A.gg()方法在另一个线程上运行!!);Thread.Sleep(5000);//将线程阻塞一定时间Console.WriteLine(终止工作线程调用此静态方法!!);}}例题1:线程的建立和启动5.3线程的建立与启动publicclassB{publicstaticvoidMain(){Console.WriteLine(***********线程简单示例!***********);Aa=newA();Threads1=newThread(newThreadStart(a.ff));s1.Start();Console.WriteLine(启动新线程ff()方法后,被Main()线程调用!!);Threads2=newThread(newThreadStart(A.gg));s2.Start();Console.WriteLine(启动新线程gg()方法后,被Main()线程调用!!);Console.ReadLine();}}例题1:线程的建立和启动5.3线程的建立与启动线程的挂起(或暂停)(1)调用Thread.Sleep()方法将线程挂起。注:Sleep()方法指定的时间以毫秒为单位。(2)调用s1.Suspend()方法将线程挂起区别:前者为静态方法,并且使线程立即暂停一定时间;后者为实例方法,不会使线程立即停止执行,直到线程到达安全点之后,它才将该线程暂停。线程的恢复与终止调用Resume()方法将线程恢复;调用Abort()方法将线程终止;线程的挂起、恢复与终止其他与操作线程相关的方法Join():使一个线程等待另一个线程停止Interrupt():中断处于JoinWaitSleep线程状态的线程。5.4线程的优先级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()将由应用程序线程执行输出结果混乱5.4线程的优先级线程是根据其优先级来调度的,每个线程都有特定的优先级。每个线程在创建时其优先级为:ThreadPriority.Normal线程的优先级定义为ThreadPriority枚举类型,如下表:5.4线程的优先级例题1: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);}}无优先级线程,同时执行,输出无序….例题1: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;}将在执行第一个线程前执行objThreadTwo5.4线程的优先级5.4线程的优先级【代码见下:】问题:请将代码执行多次,观察每次执行顺序的不同之处。为什么代码执行是完全不同呢?【结论:】如果不将线程按照一定的顺序运行,则线程代码在处理上将会混乱不堪。例题2:使用三个线程显示计数5.4线程的优先级【线程优先级小结:】如果自行提高一个线程的优先级,那么该线程就会相应的获得更多的CPU时间;通过降低了线程的优先级,该线程就会被分配到比原来少的CPU时间了。你可以在一个线程开始运行前或是在它的运行过程中的任何时候改变它的优先级。理论上你还可以任意的设置每个线程的优先级,不过一个优先级过高的线程往往会影响到其他线程的运行,甚至影响到其他程序的运行,所以最好不要随意的设置线程的优先级。例题1:使用三个线程显示计数【代码更改】5.5线程的同步使用线程的一个重要方面是同步访问多个线程访问的任何变量。背景:当多个线程共享数据,其中一个或多个线程要修改数据时,有可能引起数据不统一等问题。同步:是指在某一时刻只有一个线程可以访问某共享数据。1、同步的含义同步问题的产生,主要是由于在高级语言的源代码中,大多数情况下看起来是一条语句,但在最后编译好的汇编语言机器码中则会被翻译为许多条语句,从而在操作系统调度时被划分到不同的时间片中。例如5.5线程的同步例如:message+=Helloworld!;这条语句在C#语法上是一条语句,但在执行代码时,实际上它涉及到许多操作。需要重新分配内存以存储更长的新字符串,需要设置变量message使之指向

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

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

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

×
保存成功