创建多线程程序实用教案_第1页
创建多线程程序实用教案_第2页
创建多线程程序实用教案_第3页
创建多线程程序实用教案_第4页
创建多线程程序实用教案_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1内容提要内容提要(ni rn t yo) 实现线程 定义(dngy)线程的生命周期 实现多线程 识别线程的优先级 在线程中使用同步 识别进程间的通信第1页/共47页第一页,共48页。2同时(tngsh)执行所有任务,时间更少,效率更高线程简介线程简介(jin ji)在同一时间点执行(zhxng)各项进程 编译程序 发送/接收邮件 打印文件 其他操作系统允许计算机同时执行多项操作程序(进程)第2页/共47页第二页,共48页。3线程简介线程简介(jin ji)程序(chngx) 1 程序(chngx) 2线程 1线程 2线程 3线程 1线程 2线程 3单独的执行路径第3页/共47页第三页,共48

2、页。4进程进程(jnchng)和线程和线程 n进程进程(jnchng)(jnchng)是程序的一次执行是程序的一次执行n一个或多个线程构成一个进程一个或多个线程构成一个进程(jnchng)(jnchng)进程进程(jnchng)线程第4页/共47页第四页,共48页。5线程简介线程简介(jin ji)在以下情况中可能(knng)要使用到多线程: l程序(chngx)需要同时执行两个或多个任务l程序要等待某事件的发生,例如用户输入、文件操作、网络操作、搜索等l后台程序第5页/共47页第五页,共48页。6线程及多线程工作线程及多线程工作(gngzu)原理原理 线程表示计算机执行的指令序列。 一个处理

3、器在某一刻只能处理一个任务。如果有一个多处理器系统,理论上它可以同时执行多个指令一个处理器执行一个指令,但大多数人使用的是单处理器计算机,这种情况是不可能同时发生的。而实际上,Windows操作系统表面上可以同时处理多个任务,这个过程(guchng)称为抢先式多任务处理(pre-emptive multitasking)。第6页/共47页第六页,共48页。7抢先抢先(qing xin)式多任务处理式多任务处理 所谓抢先式多任务处理,是指Windows在某个进程中选择一个线程,该线程运行一小段时间。Microsoft没有说明这段时间有多长,因为为了获得最好的性能,Windows有一个内部操作系统

4、参数来控制这个时间值。但在运行Windows应用程序时,用户不需要知道它。从我们的角度来看,这个时间非常(fichng)短,肯定不会超过几毫秒。这段很短的时间称为线程的时间片(time slice)。过了这个时间片后,Windows就收回控制权,选择下一个被分配了时间片的线程。这些时间片非常(fichng)短,我们可以认为许多事件是同时发生的。 第7页/共47页第七页,共48页。8实现实现(shxin)线程线程 线程被用来(yn li)运行完成大型和复杂计算的程序。 使用一个线程执行的进程被称为单线程进程,这里进程是一个程序的运行实例。 单线程程序一次仅可以完成一个任务。在另一个任务开始之前,

5、你必须等待一个任务完成。第8页/共47页第八页,共48页。9实现实现(shxin)线程线程 下图显示了单线程进程。 为了(wi le)一次执行多于一个任务,你可以在程序中创建多个线程。 创建两个或更多线程的进程被称为多线程进程。第9页/共47页第九页,共48页。10C#中的线程模型中的线程模型(mxng) 在单线程模型中,程序使用轮询来调用事件循环。 轮询是一个进程,在其中一次执行一个单一的事件。 在带有轮询方法的事件循环中,单一线程以无限循环的方式运行直到(zhdo)它的操作完成。 在单线程程序中,如果线程从执行被挂起因为它正在等待一个系统资源,整个程序停止执行。 在多线程中,一个线程等待的

6、CPU时间可以被用来完成另一个任务。第10页/共47页第十页,共48页。11C#中的线程模型中的线程模型(mxng) 在CLR中有两种线程 System.Threading.Thread代表(dibio)托管线程 System.Diagonostics.ProcessThread代表(dibio)OS线程 using System; class HelloWorld static void Main() Console.WriteLine (Hello, World); Console.ReadLine(); 第11页/共47页第十一页,共48页。12主线主线(zh xin)程程 主线程在C#

7、程序开始执行的时候被自动创建(chungjin)。 使用Thread类被排他创建(chungjin)的线程被称为子线程,其中主线程被称为父线程或者基本线程。 你可以使用Thread类的CurrentThread属性来访问线程。第12页/共47页第十二页,共48页。13使用使用(shyng)线程线程 在C#中,通过ThreadStart创建线程调用方法的引用(ynyng),并将该引用(ynyng)通过创建一个Thread类型的对象创建一个线程,接着调用新线程的Start()方法启动线程。 ThreadStart ChildRef = new ThreadStart(ChildThreadCall

8、); Thread ChildThread = new Thread(ChildRef); ChildThread.Start();引用System.Threading 命名(mng mng)空间Thread 线程实例名 = new Thread(new ThreadStart(方法名);只创建但不启动线程只创建但不启动线程线程实例名.Start();启动线程启动线程第13页/共47页第十三页,共48页。14使用使用(shyng)线程线程 新线程开始异步执行线程的方法调用。 线程的处理 启动线程(Start方法) 挂起线程(Suspend方法) 挂起不会立即(lj)生效 恢复被刮起的线程(Re

9、sume方法) 恢复不会立即(lj)生效 终止线程(Abort方法) 线程的休眠(Sleep方法)第14页/共47页第十四页,共48页。15管理管理(gunl)线程线程 有许多你可能需要完成的任务来管理线程的活动或生命。 可以通过使用Thread类的各种( zhn)可用线程方法来管理这些任务。 Thread.Sleep()静态方法调用静态CurrentThread方法,然后它在指定的时间内暂停线程。第15页/共47页第十五页,共48页。16管理管理(gunl)线程线程 临时挂起会话进程(用户通常不会这么做,但这仅是一个示例,在更真实的示例中,用户可能是暂停声音文件或视频文件的播放(b fn))

10、 。 在主线程中编写如下代码,挂起该线程:depthChangeThread.Suspend(); 如果需要恢复该线程,可以使用下面的方法:depthChangeThread.Resume(); 如需要退出该线程depthChangeThread.Abort();第16页/共47页第十六页,共48页。17线程使用线程使用(shyng)示例示例using System;using System.Threading;class BasicThreadApp public static void ChildThreadCall() try Console.WriteLine(Child thread

11、 started); Console.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 fini

12、shed); public static 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 -

13、Aborting child thread); ChildThread.Abort(); Console.ReadLine(); 第17页/共47页第十七页,共48页。18线程生命周期线程生命周期 当System.Threading.Thread类的对象被创建的时候,线程的生命周期开始。线程的生命周期结束于任务的执行。 在线程的生命周期中有各种状态。这些(zhxi)状态是: 未启动状态 运行态 未运行态 死亡态第18页/共47页第十八页,共48页。19未启动未启动(qdng)状态状态 当一个Thread类的实例被创建的时候,线程进入未启动状态。 新线程是Thread类的一个空对象,没有系统资源

14、例如(lr)内存被分配给它。第19页/共47页第十九页,共48页。20运行运行(ynxng)态态 线程一直处在未启动状态直到程序调用Thread类的Start()方法,它将线程置于运行态,并且立即返回控制到调用的线程。 这个状态也被称为准备或启动状态。 新启动的线程和程序中任何(rnh)其它线程同时执行。第20页/共47页第二十页,共48页。21Start()StartedWork CompletedStopped线程生命周期线程生命周期第21页/共47页第二十一页,共48页。22未运行未运行(ynxng)态态 如果(rgu)它处于下面的状态,那么线程处于未运行态 休眠 等待 阻塞第22页/共

15、47页第二十二页,共48页。23Start()StartedSuspend()SuspendedResume()线程生命周期线程生命周期第23页/共47页第二十三页,共48页。24Start()StartedSleep()Wait/JoinSleepInterrupt()Time Expires线程生命周期线程生命周期第24页/共47页第二十四页,共48页。25死亡死亡(swng)状态状态 当线程方法的语句(yj)完成的时候,运行线程进入死亡状态。这个状态也被称为终结态。 程序可以通过在适当的线程对象上调用Thread类的Abort()方法来强迫线程进入死亡态。第25页/共47页第二十五页,共

16、48页。26Start()StartedAbort()Stop RequestThread Responds to Stop RequestStopped线程生命周期线程生命周期第26页/共47页第二十六页,共48页。27介绍介绍(jisho)多线程多线程 多线程有助于同时完成各种操作,节省用户的时间。 多线程允许你在一个程序中完成多个任务。 多任务是同时执行(zhxng)多个任务的能力。 多任务可以被分成如下类型: 基于进程的多任务 基于线程的多任务 该女士该女士(nsh)在同时吃苹果、在同时吃苹果、看书看书并在电脑上工作。并在电脑上工作。第27页/共47页第二十七页,共48页。28多线程的

17、优点多线程的优点(yudin)和限制和限制 多线程的优点(yudin)有: 改进性能 最小化系统资源 同时访问多个程序 程序结构简化 多线程的限制有: 竞态情况同时读写同一个变量 死锁情况互相等待对方释放所需资源 饥饿锁低优先级的线程无限等待第28页/共47页第二十八页,共48页。29创建创建(chungjin)多线程示例多线程示例using System;u s i n g S y s t e m . T h r e a d i n g ;c l a s s T h r e a d S c h e d u l e public static void ChildThread1() Conso

18、le.WriteLine(Child thread 1 started); C o n s o l e . W r i t e L i n e ( C h i l d t h r e a d - c o u n t i n g f r o m 1 t o 1 0 ) ; f o r ( i n t T = 1 ; T 1 1 ; T + + ) for (int Cnt = 0; Cnt 100; Cnt+) C o n s o l e . W r i t e ( . ) ; Console.Write(0, T); C o n s o l e . W r i t e L i n e ( C

19、h i l d t h r e a d 1 f i n i s h e d ) ; p u b l i c s t a t i c v o i d C h i l d T h r e a d 2 ( ) C o n s o l e . W r i t e L i n e ( C h i l d t h r e a d 2 s t a r t e d ) ; C o n s o l e . W r i t e L i n e ( C h i l d t h r e a d - c o u n t i n g s l o w l y f r o m 1 1 t o 2 0 ) ; f o r (

20、i n t T = 1 1 ; T 2 1 ; T + + ) for (int Cnt = 0; Cnt 0) /卖书过程(guchng) Thread.Sleep(1000); num = num - 1; Console.WriteLine(售出一本); else Console.WriteLine(没有了); public class MyClasspublic class MyClass public static void Main() public static void Main() BookShop a = new BookShop(); BookShop a = new B

21、ookShop(); Thread t1 = new Thread(new Thread t1 = new Thread(new ThreadStart(aThreadStart(a.Sale); Sale); Thread t2 = new Thread(new Thread t2 = new Thread(new ThreadStart(aThreadStart(a.Sale); Sale); t1 t1.Start();Start(); t2 t2.Start();Start(); Console Console.Read();Read(); 第41页/共47页第四十一页,共48页。42同步同步(tngb)注意问题注意问题 不要滥用(lny

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论