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

上传人:宝路 文档编号:48333192 上传时间:2018-07-13 格式:PPT 页数:33 大小:771.43KB
返回 下载 相关 举报
《实践开发教程》多线程编程技术_第1页
第1页 / 共33页
《实践开发教程》多线程编程技术_第2页
第2页 / 共33页
《实践开发教程》多线程编程技术_第3页
第3页 / 共33页
《实践开发教程》多线程编程技术_第4页
第4页 / 共33页
《实践开发教程》多线程编程技术_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《《实践开发教程》多线程编程技术》由会员分享,可在线阅读,更多相关《《实践开发教程》多线程编程技术(33页珍藏版)》请在金锄头文库上搜索。

1、-基于C# 语言主讲教师:钱 哨 本课学时:72课时 联系方式:Windows程序设计第五章、多线程编程技术n本章主要内容介绍5.1 计算机线程介绍 5.2 System.Threading简介 5.3 线程的优先级与锁技术CONTENT本章学习目标: 理解线程的概念 理解.NET中线程的属性和方法 创建和使用线程 理解线程的特点、优点及使用场合同时执行所有任务, 时间更少,效率更高人 体5.1 线程简介读 ,写一览无遗血液循环在同一时间点执行各项进程 编译程序 发送/接收邮件 打印文件 其他操作系统允许计算机 同时执行多项操作程序 (进程)5.1 线程简介程序 1 程序 2线程 1线程 2线

2、程 3线程 1线程 2线程 3单独的执行路径5.1 线程简介 进程:是应用程序的一个运行例程,是应用 程序的一次动态执行过程。 线程:是进程中的一个执行单元;是操作系 统分配CPU时间的基本单元。n Windows是一个支持多线程的系统。 n 一个进程可以包含若干个线程。5.1 线程简介在以下情况中可能要使用到多线程: l程序需要同时执行两个或多个任务l程序要等待某事件的发生,例如用户输入、文件操作 、网络操作、搜索等l后台程序5.1 线程简介 多线程:在同一时间执行多个任务的功能,称为多线 程或自由线程。 多线程的优点:可以同时完成多个任务;可以使程序 的响应速度更快;可以让占用大量处理时间

3、的任务或 当前没有进行处理的任务定期将处理时间让给别的任 务;可以随时停止任务;可以设置每个任务的优先级 以优化程序性能。 多线程的缺点:对资源的共享访问可能造成冲突(对共享资源的访问 进行同步或控制) ;程序的整体运行速度减慢等等。在C#应用程序中,第一个线程总是Main()方法,因为第一 个线程是由.NET运行库开始执行的,Main()方法是.NET运 行库选择的第一个方法。后续的线程由应用程序在内部启 动,即应用程序可以创建和启动新的线程。5.2 System.Threading 命名空间5.2 System.Threading 命名空间 在.NET程序设计中,线程是使用Thread类(

4、或 Timer类(线程计数器)、ThreadPool类(线程池 )来处理的,这些类在System.Threading命名空 间中:using System.Threading; Thread类:(实现线程的主要方法)一个Thread 实例管理一个线程,即执行序列。通过简单实例化 一个Thread对象,就可以创建一个线程,然后通 过Thread对象提供的方法对线程进行管理。 Timer类:适用于间隔性的完成任务。 ThreadPool类:适用于多个小的线程。1、Thread 类的属性和方法引用System.Threading 命名空间Thread 线程实例名 = new Thread(new T

5、hreadStart(方法名);运行在线程上的方法 只创建但不启动线程线程实例名.Start();1、Thread 类的属性和方法属性 CurrentThread 获取当前正在运行的线程 IsAlive 指示当前线程的执行状态 Name 获取或设置线程的名称 Priority 获取或设置线程的优先级 CurrentContext 获取线程其中执行的当前上下文 IsBackground 指示线程是否为后台线程 ThreadState 获取或设置线程的当前状态方法Sleep() 将当前线程阻塞指定的毫秒数 Abort() 终止线程 Join() 阻塞调用线程,直到某个线程终止时为 止 Resume

6、() 继续 已挂起的线程 Start() 启动线 程 Suspend() 挂起线程 GetDomain 返回当前线程正在其中运行的当前域 Interrupt 中断处于WaitSleepJoin线程状态的线程 ResetAbort 取消为当前线程请求的Abort2、线程的生命周期在 I/O 操作期间线程被阻止线程已创建但并未启动线程已启动 I/O 操作完成后运行线程被阻止,另一个操作正在进行提前中断或特地停止线程暂时中断的线程 线程已恢复等待 / 休眠 / 加入已暂停正在运行已停止未开始已开始已阻止暂停发送I/O 请求等待, 休眠, 加入开始I/O 完成完成恢复5.3 线程的建立与启动新建一个线

7、程的过程:只需将其声明并为其提供线程起始点 处的方法委托,再用Thread.Start()方法启动该线程 (1)声明: Thread a; (2)实例化 a=new Thread(new ThreadStart(b); 其中,b为新建过程中执行的过程名。 (3)调用Thread.Start()方法启动该线程 a.Start();5.3 线程的建立与启动using System; using System.Threading; public class A public void ff()/线程启动时调用此方法 Console.WriteLine(“A.ff()方法在另一个线程上运行!“); T

8、hread.Sleep(3000);/将线程阻塞一定时间 Console.WriteLine(“终止工作线程调用此实例方法!“); public static void gg() Console.WriteLine(“A.gg()方法在另一个线程上运行!“); Thread.Sleep(5000);/将线程阻塞一定时间 Console.WriteLine(“终止工作线程调用此静态方法!“); 例题1:线程的建立和 启动5.3 线程的建立与启动public class B public static void Main() Console.WriteLine(“*线程简单示例!*“); A a=

9、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(); 例题1:线程的建立和 启动5.3 线程的建立与启动线程的挂起(或暂停) (1)调用Thread.Sleep()方法将线程挂

10、起。 注:Sleep()方法指定的时间以毫秒为单位。 (2)调用s1.Suspend() 方法将线程挂起 区别:前者为静态方法,并且使线程立即暂停一定时间;后者为实例方 法,不会使线程立即停止执行,直到线程到达安全点之后,它才将该线 程暂停。 线程的恢复与终止 调用Resume()方法将线程恢复; 调用Abort()方法将线程终止;线程的挂起、恢复与终 止其他与操作线程相关的方法Join():使一个线程等待另一个线程停止 Interrupt():中断处于JoinWaitSleep线程状态的线程。5.4 线程的优先级class SimpleThreadDemo static void Main(

11、string args) Thread.CurrentThread.Name = “主线程“; Thread objThread = new Thread(new ThreadStart(ActionMethod); objThread.Name = “子线程“;/启动子线程, 并为该线程执行 ActionMethod objThread.Start(); /这将为主线程执行 ActionMethod ActionMethod();static void ActionMethod() for(int count = 1; count =4990; index-)Console.WriteLin

12、e(index); static void Main(string args) Thread objThreadOne = new Thread(new ThreadStart(TaskOne); Thread objThreadTwo = new Thread(new ThreadStart(TaskTwo); objThreadOne.Start(); objThreadTwo.Start(); static void TaskOne() for(int count=1;count=5;count+)Console.WriteLine(count*2); 无优先级线程,同时执行,输出无序.

13、例 题 1 :static void Main(string args) Thread.CurrentThread.Name = “主线程“;Thread objThreadOne = new Thread(new ThreadStart(TaskOne);objThreadOne.Name = “子线程 1“;Thread objThreadTwo = new Thread(new ThreadStart(TaskTwo);objThreadTwo.Name = “子线程 2“;/ 这将启动子线程objThreadOne.Start();objThreadTwo.Start();objThr

14、eadTwo.Priority = ThreadPriority.Highest; 将在执行第一个线程前执行 objThreadTwo5.4 线程的优先级5.4 线程的优先级【代码见下:】 问题:请将代码执行多次,观察每次执行顺序的不同之处 。为什么代码执行是完全不同呢?【结论:】 如果不将线程按照一定的顺序运行,则线程代码在处理上 将会混乱不堪。例题2:使用三个线程显示计数5.4 线程的优先级【线程优先级小结:】如果自行提高一个线程的优先级,那么该线程就会相应 的获得更多的CPU时间;通过降低了线程的优先级,该线 程就会被分配到比原来少的CPU时间了。你可以在一个线程开始运行前或是在它的运行

15、过程中的 任何时候改变它的优先级。理论上你还可以任意的设置每 个线程的优先级,不过一个优先级过高的线程往往会影响 到其他线程的运行,甚至影响到其他程序的运行,所以最 好不要随意的设置线程的优先级。 例题1:使用三个线程显示计数【代码更改 】5.5 线程的同步使用线程的一个重要方面是同步访问多个线程访问的任何变量 。n 背景:当多个线程共享数据,其中一个或多个线程要修改数 据时,有可能引起数据不统一等问题。 n 同步:是指在某一时刻只有一个线程可以访问某共享数据。1、同步的含义同步问题的产生,主要是由于在高级语言的源代码中,大 多数情况下看起来是一条语句,但在最后编译好的汇编语言机 器码中则会被

16、翻译为许多条语句,从而在操作系统调度时被划 分到不同的时间片中。 例如5.5 线程的同步例如: message += “Hello world!“; 这条语句在C#语法上是一条语句,但在执行代码时,实际上它 涉及到许多操作。需要重新分配内存以存储更长的新字符串, 需要设置变量message使之指向新的内存,需要复制实际文本 等。5.5 线程的同步通过对指定对象的加锁和解锁可以实现同步代码段的访问。 在.NET的System.Threading命名空间中提供了Monitor类来实 现加锁与解锁。该类中的方法都是静态的。如下表:1、在C#中处理同步锁定机制程序线程1线程2共享资源 锁定机制保证每次

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件

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