《多线程技术》PPT课件.ppt
《《多线程技术》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《多线程技术》PPT课件.ppt(48页珍藏版)》请在三一办公上搜索。
1、第六讲 C#多线程技术,主要内容,6.1 线程概述6.2.NET对多线程的支持6.3 一个多线程程序6.4 线程的优先级 6.5 线程的同步 6.6 多线程的自动管理 6.7 应用实例,6.1 线程概述,进程:是应用程序的一个运行例程,是应用程序的一次动态执行过程。线程:是进程中的一个执行单元;是操作系统分配CPU时间的基本单元。Windows是一个支持多线程的系统。一个进程可以包含若干个线程。,多线程的概念,多线程:在同一时间执行多个任务的功能,称为多线程或自由线程。多线程的优点:可以同时完成多个任务;可以使程序的响应速度更快;可以让占用大量处理时间的任务或当前没有进行处理的任务定期将处理时
2、间让给别的任务;可以随时停止任务;可以设置每个任务的优先级以优化程序性能。主要缺点:对资源的共享访问可能造成冲突(对共享资源的访问进行同步或控制);程序的整体运行速度减慢等等。,在C#应用程序中,第一个线程总是Main()方法,因为第一个线程是由.NET运行库开始执行的,Main()方法是.NET运行库选择的第一个方法。后续的线程由应用程序在内部启动,即应用程序可以创建和启动新的线程。,6.2.NET对多线程的支持,在.NET程序设计中,线程是使用Thread类(或Timer类(线程计数器)、ThreadPool类(线程池)来处理的,这些类在System.Threading命名空间中:usin
3、g System.Threading;Thread类:(实现线程的主要方法)一个Thread实例管理一个线程,即执行序列。通过简单实例化一个Thread对象,就可以创建一个线程,然后通过Thread对象提供的方法对线程进行管理。Timer类:适用于间隔性的完成任务。ThreadPool:适用于多个小的线程。,Thread类的主要属性,1、CurrentThread:获取当前正在运行的线程。2、Name:获取或设置线程的名称。3、Priority:获取或设置线程的优先级。4、TreadState:获取或设置线程的当前状态。5、IsBackground:指示线程是否为后台线程。6、IsAlive:
4、指示当前线程的执行状态。7、CurrentContext:获取线程其中执行的当前上下文。,Thread类的主要方法,1、Abort:终止线程。2、GetDomain:返回当前线程正在其中运行的当前域。3、Interrupt:中断处于WaitSleepJoin线程状态的线程。4、Join:阻塞调用线程,直到某个线程终止时为止。5、ResetAbort:取消为当前线程请求的Abort6、Resume:继续已挂起的线程。7、Sleep:将当前线程阻塞指定的毫秒数。8、Start:启动线程。9、Suspend;挂起线程。,Thread类中线程的状态,由Thread类的TreadState属性来确定:A
5、bort、AbortRequested、BackGround、Running、Stopped、StopRequested、Suspended、SuspendRequsted、Unstarted、WaitSleepJoin,线程的建立与启动,新建一个线程的过程:只需将其声明并为其提供线程起始点处的方法委托,再用Thread.Start()方法启动该线程(1)声明:Thread a;(2)实例化a=new Thread(new ThreadStart(b);其中,b为新建过程中执行的过程名。(3)调用Thread.Start()方法启动该线程a.Start();,例题1:线程的建立和启动,usin
6、g System;using System.Threading;public class Apublic void ff()/线程启动时调用此方法Console.WriteLine(A.ff()方法在另一个线程上运行!);Thread.Sleep(3000);/将线程阻塞一定时间Console.WriteLine(终止工作线程调用此实例方法!);public static void gg()Console.WriteLine(A.gg()方法在另一个线程上运行!);Thread.Sleep(5000);/将线程阻塞一定时间Console.WriteLine(终止工作线程调用此静态方法!);,p
7、ublic class Bpublic static void Main()Console.WriteLine(*线程简单示例!*);A a=new A();Thread s1=new Thread(new ThreadStart(a.ff);s1.Start();Console.WriteLine(启动新线程ff()方法后,被Main()线程调用!);Thread s2=new Thread(new ThreadStart(A.gg);s2.Start();Console.WriteLine(启动新线程gg()方法后,被Main()线程调用!);Console.ReadLine();,线程的
8、挂起、恢复与终止,线程的挂起(或暂停)(1)调用Thread.Sleep()方法将线程挂起。注:Sleep()方法指定的时间以毫秒为单位。(2)调用s1.Suspend()方法将线程挂起区别:前者为静态方法,并且使线程立即暂停一定时间;后者为实例方法,不会使线程立即停止执行,直到线程到达安全点之后,它才将该线程暂停。线程的恢复与终止调用Resume()方法将线程恢复;调用Abort()方法将线程终止;,其他与操作线程相关的方法,Join():使一个线程等待另一个线程停止Interrupt():中断处于JoinWaitSleep线程状态的线程。,6.3 一个多线程程序,例题2 使用两个线程显示计
9、数。该示例的核心是方法DisplayNumbers(),它累加一个数字,并定期显示每次累加的结果:using System;using System.Threading;namespace ConsoleThread class ThreadApp static int interval;,static void DisplayNumbers()/获取当前运行线程的Thread对象实例 Thread thisThread=Thread.CurrentThread;Console.WriteLine(线程:+thisThread.Name+已开始运行.);/循环计数直到结束,在指定的间隔输出当前
10、计数值 for(int i=1;i=8*interval;i+)if(i%interval=0)Console.WriteLine(thisThread.Name+:当前计数为+i);Console.WriteLine(线程+thisThread.Name+完成.);,static void Main(string args)/获取用户输入的数字 Console.Write(请输入一个数字:);interval=int.Parse(Console.ReadLine();/定义当前主线程线程对象的名字 Thread thisThread=Thread.CurrentThread;thisThre
11、ad.Name=Main Thread;/建立新线程对象 ThreadStart workerStart=new ThreadStart(DisplayNumbers);Thread workerThread=new Thread(workerStart);workerThread.Name=Worker Thread;workerThread.IsBackground=true;workerThread.Start();/启动新线程DisplayNumbers();/主线程同步进行计数,6.4 线程的优先级,线程是根据其优先级来调度的,每个线程都有特定的优先级。每个线程在创建时其优先级为:T
12、hreadPriority.Normal线程的优先级定义为ThreadPriority枚举类型,如下表:,例题3:修改上述例题,对Main()方法做如下修改,观察修改线程的优先级的效果:ThreadStart workerStart=new ThreadStart(DisplayNumbers);Thread workerThread=new Thread(workerStart);workerThread.Name=Worker Thread;workerThread.Priority=ThreadPriority.AboveNormal;结果:一旦工作线程被启动,主线程不再运行,直到工作线
13、程结束后主线程才重新计算。,6.5 线程的同步,使用线程的一个重要方面是同步访问多个线程访问的任何变量。背景:当多个线程共享数据,其中一个或多个线程要修改数据时,有可能引起数据不统一等问题。同步:是指在某一时刻只有一个线程可以访问某共享数据1、同步的含义同步问题的产生,主要是由于在高级语言的源代码中,大多数情况下看起来是一条语句,但在最后编译好的汇编语言机器码中则会被翻译为许多条语句,从而在操作系统调度时被划分到不同的时间片中。例如:,message+=Hello world!;这条语句在C#语法上是一条语句,但在执行代码时,实际上它涉及到许多操作。需要重新分配内存以存储更长的新字符串,需要设
14、置变量message使之指向新的内存,需要复制实际文本等。,2、在C#中处理同步,通过对指定对象的加锁和解锁可以实现同步代码段的访问。在.NET的System.Threading命名空间中提供了Monitor类来实现加锁与解锁。该类中的方法都是静态的。如下表:,C#中 lock关键字提供了与Monitoy.Enter和Monitoy.Exit同样的功能,这种方法用在你的代码段不能被其他独立的线程中断的情况。通过对Monitor类的简易封装,lock为同步访问变量提供了一个非常简单的方式,其用法如下:lock(x)/使用x的语句lock语句把变量放在圆括号中,以包装对象,称为独占锁或排它锁。当执
15、行带有lock关键字的复合语句时,独占锁会保留下来。当变量被包装在独占锁中时,其他线程就不能访问该变量。如果在上面的代码中使用独占锁,在执行复合语句时,这个线程就会失去其时间片。如果下一个获得时间片的线程试图访问变量,就会被拒绝。Windows会让其他线程处于睡眠状态,直到解除了独占锁为止。,例题4:使用lock同步线程。本示例建立了10个线程,using System;using System.Threading;/银行帐户类class Account int balance;/余额 Random r=new Random();public Account(int initial)balan
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多线程技术 多线程 技术 PPT 课件
链接地址:https://www.31ppt.com/p-5489144.html