版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十一章 创建多线程程序,沈项军 计算机科学与通信工程学院,.,2,内容提要,实现线程 定义线程的生命周期 实现多线程 识别线程的优先级 在线程中使用同步 识别进程间的通信,.,3,同时执行所有任务,时间更少,效率更高,线程简介,在同一时间点执行各项进程,编译程序 发送/接收邮件 打印文件 其他,操作系统允许计算机同时执行多项操作,程序 (进程),.,4,线程简介,程序 1,程序 2,线程 1,线程 2,线程 3,线程 1,线程 2,线程 3,单独的执行路径,多线程,.,5,进程和线程,进程是程序的一次执行 一个或多个线程构成一个进程,进程,线程,.,6,线程简介,在以下情况中可能要使用到多线
2、程:,程序需要同时执行两个或多个任务,程序要等待某事件的发生,例如用户输入、文件操作、网络操作、搜索等,后台程序,.,7,线程及多线程工作原理,线程表示计算机执行的指令序列。 一个处理器在某一刻只能处理一个任务。如果有一个多处理器系统,理论上它可以同时执行多个指令一个处理器执行一个指令,但大多数人使用的是单处理器计算机,这种情况是不可能同时发生的。而实际上,Windows操作系统表面上可以同时处理多个任务,这个过程称为抢先式多任务处理(pre-emptive multitasking)。,.,8,抢先式多任务处理,所谓抢先式多任务处理,是指Windows在某个进程中选择一个线程,该线程运行一小
3、段时间。Microsoft没有说明这段时间有多长,因为为了获得最好的性能,Windows有一个内部操作系统参数来控制这个时间值。但在运行Windows应用程序时,用户不需要知道它。从我们的角度来看,这个时间非常短,肯定不会超过几毫秒。这段很短的时间称为线程的时间片(time slice)。过了这个时间片后,Windows就收回控制权,选择下一个被分配了时间片的线程。这些时间片非常短,我们可以认为许多事件是同时发生的。,.,9,实现线程,线程被用来运行完成大型和复杂计算的程序。 使用一个线程执行的进程被称为单线程进程,这里进程是一个程序的运行实例。 单线程程序一次仅可以完成一个任务。在另一个任务
4、开始之前,你必须等待一个任务完成。,.,10,实现线程,下图显示了单线程进程。 为了一次执行多于一个任务,你可以在程序中创建多个线程。 创建两个或更多线程的进程被称为多线程进程。,.,11,C#中的线程模型,在单线程模型中,程序使用轮询来调用事件循环。 轮询是一个进程,在其中一次执行一个单一的事件。 在带有轮询方法的事件循环中,单一线程以无限循环的方式运行直到它的操作完成。 在单线程程序中,如果线程从执行被挂起因为它正在等待一个系统资源,整个程序停止执行。 在多线程中,一个线程等待的CPU时间可以被用来完成另一个任务。,.,12,C#中的线程模型,在CLR中有两种线程 System.Threa
5、ding.Thread代表托管线程 System.Diagonostics.ProcessThread代表OS线程 using System; class HelloWorld static void Main() Console.WriteLine (Hello, World); Console.ReadLine(); ,.,13,主线程,主线程在C#程序开始执行的时候被自动创建。 使用Thread类被排他创建的线程被称为子线程,其中主线程被称为父线程或者基本线程。 你可以使用Thread类的CurrentThread属性来访问线程。,.,14,使用线程,在C#中,通过ThreadStart
6、创建线程调用方法的引用,并将该引用通过创建一个Thread类型的对象创建一个线程,接着调用新线程的Start()方法启动线程。 ThreadStart ChildRef = new ThreadStart(ChildThreadCall); Thread ChildThread = new Thread(ChildRef); ChildThread.Start();,引用System.Threading 命名空间,Thread 线程实例名 = new Thread(new ThreadStart(方法名);,只创建但不启动线程,线程实例名.Start();,启动线程,.,15,使用线程,新线程
7、开始异步执行线程的方法调用。 线程的处理 启动线程(Start方法) 挂起线程(Suspend方法) 挂起不会立即生效 恢复被刮起的线程(Resume方法) 恢复不会立即生效 终止线程(Abort方法) 线程的休眠(Sleep方法),.,16,管理线程,有许多你可能需要完成的任务来管理线程的活动或生命。 可以通过使用Thread类的各种可用线程方法来管理这些任务。 Thread.Sleep()静态方法调用静态CurrentThread方法,然后它在指定的时间内暂停线程。,.,17,管理线程,临时挂起会话进程(用户通常不会这么做,但这仅是一个示例,在更真实的示例中,用户可能是暂停声音文件或视频文
8、件的播放) 。 在主线程中编写如下代码,挂起该线程: depthChangeThread.Suspend(); 如果需要恢复该线程,可以使用下面的方法: depthChangeThread.Resume(); 如需要退出该线程 depthChangeThread.Abort();,.,18,线程使用示例,using System; using System.Threading; class BasicThreadApp public static void ChildThreadCall() try Console.WriteLine(Child thread started); Consol
9、e.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.WriteLine(Child Thread - unable to be finished); ,public st
10、atic 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.WriteLine(n Main - Aborting child t
11、hread); ChildThread.Abort(); Console.ReadLine(); ,.,19,线程生命周期,当System.Threading.Thread类的对象被创建的时候,线程的生命周期开始。线程的生命周期结束于任务的执行。 在线程的生命周期中有各种状态。这些状态是: 未启动状态 运行态 未运行态 死亡态,.,20,未启动状态,当一个Thread类的实例被创建的时候,线程进入未启动状态。 新线程是Thread类的一个空对象,没有系统资源例如内存被分配给它。,.,21,运行态,线程一直处在未启动状态直到程序调用Thread类的Start()方法,它将线程置于运行态,并且立即
12、返回控制到调用的线程。 这个状态也被称为准备或启动状态。 新启动的线程和程序中任何其它线程同时执行。,.,22,Start(),Started,Work Completed,Stopped,线程生命周期,.,23,未运行态,如果它处于下面的状态,那么线程处于未运行态 休眠 等待 阻塞,.,24,Start(),Started,Suspend(),Suspended,Resume(),线程生命周期,.,25,Start(),Started,Sleep(),Wait/Join Sleep,Interrupt(),Time Expires,线程生命周期,.,26,死亡状态,当线程方法的语句完成的时候
13、,运行线程进入死亡状态。这个状态也被称为终结态。 程序可以通过在适当的线程对象上调用Thread类的Abort()方法来强迫线程进入死亡态。,.,27,Start(),Started,Abort(),Stop Request,Thread Responds to Stop Request,Stopped,线程生命周期,.,28,介绍多线程,多线程有助于同时完成各种操作,节省用户的时间。 多线程允许你在一个程序中完成多个任务。 多任务是同时执行多个任务的能力。 多任务可以被分成如下类型: 基于进程的多任务 基于线程的多任务,该女士在同时吃苹果、看书 并在电脑上工作。,.,29,多线程的优点和限制
14、,多线程的优点有: 改进性能 最小化系统资源 同时访问多个程序 程序结构简化 多线程的限制有: 竞态情况同时读写同一个变量 死锁情况互相等待对方释放所需资源 饥饿锁低优先级的线程无限等待,.,30,创建多线程示例,using System; using System.Threading; class ThreadSchedule public static void ChildThread1() Console.WriteLine(Child thread 1 started); Console.WriteLine(Child thread - counting from 1 to 10);
15、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 thread 2 started); Console.WriteLine(Child thread - counting slowly from 11 to 20); for (int T = 11;
16、 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(new ThreadStart(a.Sale); Thread t2 = new Thread(new ThreadStart(a.Sale); t1.Start(); t2.Start(); Console.Read(); ,.,43,同步注意问题,不要滥用同步 死锁 竞态条件,.,44,识别进程间的通信,进程是程序的一个运行
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学主题班会课件:体验历史与文化传承
- 远离言语伤害守护心灵阳光小学主题班会课件
- 2026新产业面试题库及答案
- 通知项目的延期与重新规划(3篇)
- 2026年度付款凭证确认函3篇范文
- 2026政治面试题目及答案解析
- 感恩父母小宝贝:学会感恩与表达小学主题班会课件
- 2026公园扰民面试题及答案
- 中华传统节日:感受民族文化小学主题班会课件
- 商洽供应商合作条款调整函种(5篇)
- (2026)全国应急管理普法知识竞赛试题库及答案
- 2026年河南省中考真题道德与法治试卷和答案
- 2026中国航空发动机集团总部招聘36人笔试备考题库及答案详解
- 2026年全国通信专业技术人员考试高、中级(通信专业实务终端与业务)模拟试题及答案
- 2026年初二物理基础测试题及答案
- 防灾减灾安全知识普及课件
- 建筑材料检测送检指南(机电类)
- 北京市第四中学2026届高一数学第二学期期末联考试题含解析
- 2025年国控私募基金招聘笔试题库及答案汇编
- 2025年消防员历年面试题及答案
- 闲鱼培训教学课件
评论
0/150
提交评论