《第九讲多线程程序设计.pdf》由会员分享,可在线阅读,更多相关《第九讲多线程程序设计.pdf(80页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第九讲第九讲 多线程程序设计多线程程序设计周开来周开来西南林学院计算机与信息科学系西南林学院计算机与信息科学系多线程程序设计多线程程序设计?进程与线程进程与线程(Process and Threading)(Process and Threading)?异步与同步异步与同步?线程概念线程概念?ThreadThread类类?等等等等1.1 1.1 多线程与多任务多线程与多任务多线程与多任务多线程与多任务?多任务指一个操作系统同时运行多个程序的能力(一 个 运 行 中 的 程 序 称 为 一 个 进 程-Process);多线程(Multithreading)是一个程序实现多任务的能力;?并发(C
2、oncurrency)多个线程或进程在单个CPU上运行(可以同时执行,也可以不同时执行,可以在执行中,也可以在中断状态),并行(Parallelism)是多个线程或进程在多个CPU上同时并行运行;Java的多线程程序可以在单CPU下并发运行,也可在多CPU下并行运行。引言引言?DOS时代-单任务单用户A任务B任务C任务?Windows 9.X时代-多任务单用户?宏观上看:?A任务?B任务?C任务?比如:用户可以一边打字,一边听歌,还可以一边下载电影?微观上看:?A任务B任务C任务 A任务B任务C任务?Windows NT/2000 Server-多任务,多用户D任务相关概念相关概念?进程进程进
3、程进程?每一个程序对应一个进程,代表着执行的一个任务。每一个程序对应一个进程,代表着执行的一个任务。每一个程序对应一个进程,代表着执行的一个任务。每一个程序对应一个进程,代表着执行的一个任务。?进程由操作系统负责管理和调度进程由操作系统负责管理和调度进程由操作系统负责管理和调度进程由操作系统负责管理和调度?每个进程拥有自己独立的内存空间每个进程拥有自己独立的内存空间每个进程拥有自己独立的内存空间每个进程拥有自己独立的内存空间,堆栈和环境变量设置,进堆栈和环境变量设置,进堆栈和环境变量设置,进堆栈和环境变量设置,进程之间互不影响程之间互不影响程之间互不影响程之间互不影响?线程线程线程线程?线程可
4、以被描述为一个微进程线程可以被描述为一个微进程线程可以被描述为一个微进程线程可以被描述为一个微进程,它拥有起点它拥有起点它拥有起点它拥有起点,执行的顺序系列和执行的顺序系列和执行的顺序系列和执行的顺序系列和一个终点。一个终点。一个终点。一个终点。?线程是在进程的内部执行的指令序列线程是在进程的内部执行的指令序列线程是在进程的内部执行的指令序列线程是在进程的内部执行的指令序列,由进程负责管理和调度由进程负责管理和调度由进程负责管理和调度由进程负责管理和调度?在进程内的每个线程共享相同的内存空间和数据资源在进程内的每个线程共享相同的内存空间和数据资源在进程内的每个线程共享相同的内存空间和数据资源在
5、进程内的每个线程共享相同的内存空间和数据资源相关概念相关概念?进程进程?每一个程序对应一个进程,代表着执行的一个任务。每一个程序对应一个进程,代表着执行的一个任务。?进程由操作系统负责管理和调度进程由操作系统负责管理和调度?每个进程拥有自己独立的内存空间每个进程拥有自己独立的内存空间,堆栈和环境变量堆栈和环境变量设置,进程之间互不影响设置,进程之间互不影响?线程线程?线程可以被描述为一个微进程线程可以被描述为一个微进程,它拥有起点它拥有起点,执行的顺执行的顺序系列和一个终点。序系列和一个终点。?线程是在进程的内部执行的指令序列线程是在进程的内部执行的指令序列,由进程负责管由进程负责管理和调度理
6、和调度?在进程内的每个线程共享相同的内存空间和数据资源在进程内的每个线程共享相同的内存空间和数据资源通过通过WindowsWindows的任务管理器可以查看的任务管理器可以查看系统进程系统进程举例举例线程概念线程概念.NET.NET下的应用程序域下的应用程序域?在在.NET.NET下,程序集并没有直接承载在进程下,程序集并没有直接承载在进程中,而(传统的中,而(传统的Win32Win32程序是直接承载的)程序是直接承载的)?在在.NET.NET下,可执行程序承载在进程中的一个下,可执行程序承载在进程中的一个逻辑分区中,术语为应用程序域逻辑分区中,术语为应用程序域(AppDomainAppDom
7、ain)?一个进程可以包含多个应用程序域,每一个一个进程可以包含多个应用程序域,每一个应用程序域承载一个应用程序域承载一个.NET.NET可执行程序可执行程序应用应用程序域的优势应用应用程序域的优势?应用程序域是应用程序域是.NET.NET平台操作系统独立性的关平台操作系统独立性的关键特性键特性,这种逻辑分区将不同操作系统表现加这种逻辑分区将不同操作系统表现加载可执行程序的差异抽象化了载可执行程序的差异抽象化了?和一个完整的进程相比,应用程序域的和一个完整的进程相比,应用程序域的CPUCPU和内存占用都要小得多,因此和内存占用都要小得多,因此CLRCLR加载和卸加载和卸载应用程序域比起完整的进
8、程来说快得多载应用程序域比起完整的进程来说快得多?应用程序域为承载的应用程序域提供了深度应用程序域为承载的应用程序域提供了深度的隔离,如果进程中某一个应用程序域失败的隔离,如果进程中某一个应用程序域失败了,剩余的应用程序域也能保持正常了,剩余的应用程序域也能保持正常.NET.NET程序域、进程、线程关系程序域、进程、线程关系?应用程序域是承载应用程序域是承载.NET.NET程序集的进程逻辑分程序集的进程逻辑分区区?单个进程可以承载多个应用程序域单个进程可以承载多个应用程序域?每一个应用程序域都和该进程中的其他应用每一个应用程序域都和该进程中的其他应用程序域完全彻底地隔离开程序域完全彻底地隔离开
9、?线程是线程是.NET.NET下可独立执行的一个逻辑代码单下可独立执行的一个逻辑代码单元元?线程可运行在一个程序域上,也可以跨越多线程可运行在一个程序域上,也可以跨越多个应用程序域个应用程序域?在任意某一个时刻,只有某一个应用程序域在任意某一个时刻,只有某一个应用程序域上的线程在运行上的线程在运行进程进程线程线程应用程序域应用程序域代码代码代码代码数据数据数据数据文件文件文件文件应用程序域应用程序域应用程序域应用程序域应用程序域应用程序域应用程序域应用程序域进程进程进程进程什么是多线程?什么是多线程?什么是多线程?什么是多线程??多线程是为了使得多个线程并行的工作以完成多项任多线程是为了使得多
10、个线程并行的工作以完成多项任务,以提高系统的效率。务,以提高系统的效率。?在单在单CPUCPU系统中系统中,一次只能执行一个线程,线程的运行一次只能执行一个线程,线程的运行顺序取决于其优级别。顺序取决于其优级别。?当线程到达优先队列的队头时,其代码流会执行长度当线程到达优先队列的队头时,其代码流会执行长度固定的一段时间,这段时间称为时间片固定的一段时间,这段时间称为时间片(Time Slice)(Time Slice)。如果在时间片内线程未完成执行,必须存储其状态信如果在时间片内线程未完成执行,必须存储其状态信息,以便下次执行时能从该断点处恢复执行。息,以便下次执行时能从该断点处恢复执行。?线
11、程的状态信息包括寄存器、栈指针和一个程序计数线程的状态信息包括寄存器、栈指针和一个程序计数器,程序计数器将告诉线程下一次执行哪个指令器,程序计数器将告诉线程下一次执行哪个指令.?所有这些信息都存放在分配给线程本地存储区所有这些信息都存放在分配给线程本地存储区(TLS)(TLS)的的内存区中内存区中.使用多线程的好处使用多线程的好处:使用线程的好处有以下几点:使用线程的好处有以下几点:?使用线程可以把占据长时间的程序中的任务放到后台使用线程可以把占据长时间的程序中的任务放到后台去处理去处理(比如比如WordWord的打印程序,调用打印机打印文档的打印程序,调用打印机打印文档是一个很耗时的任务是一
12、个很耗时的任务)?用户界面可以更加吸引人,这样比如用户点击了一个用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度显示处理的进度(比如拷贝大文件显示文件拷贝进度)比如拷贝大文件显示文件拷贝进度)?程序的运行速度可能加快程序的运行速度可能加快(比如分多个线程对集合进行比如分多个线程对集合进行排序排序)?增强程序的响应特性增强程序的响应特性(比如,当用浏览器下载一个文件比如,当用浏览器下载一个文件时间,若网络速度较慢,中途想停止,则需要另外使时间,若网络速度较慢,中途想停止,则需要另外使用一个线程
13、来终止下载过程)用一个线程来终止下载过程)使用多线程的使用多线程的缺点缺点缺点缺点:线程的缺点:线程的缺点:线程的缺点:线程的缺点:?每个线程都需要维护当前状态,如果有大量的线程,会每个线程都需要维护当前状态,如果有大量的线程,会影响性能,因为操作系统需要在他们之间切换;影响性能,因为操作系统需要在他们之间切换;?更多的线程需要更多的内存空间,便于维护状态信息;更多的线程需要更多的内存空间,便于维护状态信息;多线程程序比较复杂,可能会给程序带来更多的多线程程序比较复杂,可能会给程序带来更多的bugbug,因此要小心使用;因此要小心使用;?线程的中止需要考虑其对其他线程序运行的影响;线程的中止需
14、要考虑其对其他线程序运行的影响;?若有多个线程共享某些资源若有多个线程共享某些资源(比如内存单元,比如内存单元,I/OI/O操作等操作等),),线程之间会产生竞争和冲突,必须要考虑线程的同步问线程之间会产生竞争和冲突,必须要考虑线程的同步问题题线程的状态线程的状态线程的状态线程的状态:?UnstartedUnstarted(未启动态未启动态未启动态未启动态)?Where a thread starts lifecycleWhere a thread starts lifecycle?Remains here until Remains here until ThreadThread metho
15、d method StartStart is calledis called?Started(Started(就绪态就绪态就绪态就绪态)?Remains here until processor begins to run itRemains here until processor begins to run it?Running(Running(运行态运行态运行态运行态)?Highest priority Started thread enters running state firstHighest priority Started thread enters running state
16、 first?Begins execution when processor is assigned to threadBegins execution when processor is assigned to thread?ThreadStartThreadStart delegate specifies actions of threadsdelegate specifies actions of threads?Stopped(Stopped(停止态停止态停止态停止态)?Enters when delegate terminatesEnters when delegate termin
17、ates?Enters if program calls Enters if program calls ThreadThread method method AbortAbort线程的状态线程的状态线程的状态线程的状态:?Blocked:(Blocked:(阻塞态阻塞态阻塞态阻塞态)?Blocked when makes I/O requestBlocked when makes I/O request?Becomes unblocked when operating system completes Becomes unblocked when operating system compl
18、etes I/OI/O?WaitSleepJoinWaitSleepJoin(等待等待等待等待,休眠和连接态休眠和连接态休眠和连接态休眠和连接态)?Enters three ways:Enters three ways:?Thread calls Thread calls MonitorMonitor method method WaitWait because it encounters because it encounters code it cannot execute yetcode it cannot execute yet?Leaves when another thread c
19、alls Leaves when another thread calls PulsePulse?Calls Calls SleepSleep method to sleep for a specified timemethod to sleep for a specified time?Two threads are joined if one cannot execute until the other Two threads are joined if one cannot execute until the other terminatesterminates?Threads Wait
20、ing or Sleeping can come out of these Threads Waiting or Sleeping can come out of these states if the threads states if the threads InterruptInterrupt method is calledmethod is called?Suspended(Suspended(挂起态挂起态)?Enters when a threads Enters when a threads SuspendSuspend method is calledmethod is cal
21、led?Returns to Started state when Returns to Started state when ResumeResume method is method is invokedinvoked线程的生命循环线程的生命循环:WaitSleepJoinSuspendedStoppedBlockedUnstartedStartedRunningdispatch(assign a processor)ResumeStartInterruptPulsePulseAllsleep interval expiresquantum expirationSuspendWaitSle
22、ep,Joincompleteissue I/O requestI/O completion在在在在.NET.NET里如何使用多线程工作里如何使用多线程工作里如何使用多线程工作里如何使用多线程工作?.NET.NET下有六种主要使用多线程的方法下有六种主要使用多线程的方法:1.1.使用异步委托使用异步委托,来创建多线程来创建多线程2.2.使用使用ThreadThread类创建线程对象类创建线程对象3.3.使用使用MethodInvokerMethodInvoker方法创建简单线程对象方法创建简单线程对象4.4.直接使用直接使用FCLFCL中一些类的异步操作方法,比如中一些类的异步操作方法,比如I
23、OIO中中的的StreamStream类的类的BeginRead,BeginWriteBeginRead,BeginWrite等等5.5.使用线程池,如使用线程池,如:ThreadPool.QueueUserWorkItemThreadPool.QueueUserWorkItem6.6.使用定时器使用定时器TimerTimer1.1.使用异步委托使用异步委托,来创建多线程来创建多线程同步和异步两种技术的抽象描述:同步和异步两种技术的抽象描述:?在同步程序中,每个方法都是按照顺序执行的,在同步程序中,每个方法都是按照顺序执行的,?在异步程序中,方法在异步程序中,方法B B可以与方法可以与方法A
24、A和和C C同时运行同时运行同步处理:同步处理:同步处理:同步处理:启动启动ABC结束结束异步处理:异步处理:异步处理:异步处理:启动启动ABC结束结束主线程主线程工作线程工作线程1.1.使用异步委托使用异步委托,来创建多线程来创建多线程同时运行两个或者多个同时运行两个或者多个(多线程多线程)会带来一些会带来一些在单线程程序中不曾有的问题:在单线程程序中不曾有的问题:1.1.主线程和工作线程之间需要什么类型的通主线程和工作线程之间需要什么类型的通信?比如,工作线程中的代码可以一经调用被信?比如,工作线程中的代码可以一经调用被忘记,或者主线程可能必须知道工作线程的任忘记,或者主线程可能必须知道工
25、作线程的任务何时完成?务何时完成?2.2.主线程如何知道工作线程何时完成?对此,主线程如何知道工作线程何时完成?对此,可有两种办法:一种是回调可有两种办法:一种是回调(CallBackCallBack)技术,技术,一种是轮询一种是轮询(Poll)(Poll)技术技术3.3.如何使请求同一资源的线程同步?如何使请求同一资源的线程同步?4.4.在工作线程仍在执行时如何终止程序?在工作线程仍在执行时如何终止程序?同步委托示例同步委托示例/(1)/(1)声明一个委托声明一个委托MyDelegateMyDelegatePublic delegate double Public delegate doub
26、le MyDelegate(intMyDelegate(int a,inta,int b);b);/(2)/(2)定义被委托调用的方法定义被委托调用的方法Public double Public double Divide(intDivide(int a,inta,int b)b)MessageBox.ShowMessageBox.Show(“计算计算”+a.ToString()+a.ToString()+”+b.ToString+b.ToString();();return a*1.0/b;return a*1.0/b;/(3)/(3)创建一个委托实例对象创建一个委托实例对象,并将方法传递给
27、它并将方法传递给它MyDelegateMyDelegate mdmd=new =new MyDelegate(DivideMyDelegate(Divide););/(4)/(4)调用委托调用委托Double result=md(5,2);Double result=md(5,2);同步委托示例同步委托示例?同步委托调用会阻塞主线程同步委托调用会阻塞主线程d double result=md(5,2);ouble result=md(5,2);for(intfor(int i=0;i10;i+)i=0;i10;i+)Console.WriteLine(Console.WriteLine(“Ma
28、inMain method Continuemethod Continue”););/Main Method do Some work hereMain Method do Some work hereConsole.WriteLine(resultConsole.WriteLine(result););?当执行当执行result=md(5,2)result=md(5,2)语句时,程序指针调转到语句时,程序指针调转到double double Divide(intDivide(int a,inta,int b)b)中去执行,直到该方法执中去执行,直到该方法执行完毕,返回结果给行完毕,返回结果给
29、ResultResult变量后,才执行变量后,才执行MainMain函函数中的下一条语句数中的下一条语句,Console.WriteLine(Console.WriteLine(“MainMain method method ContinueContinue”););理解委托类理解委托类定义委托后,定义委托后,.NET.NET编译器自动创建一个表示该委托的编译器自动创建一个表示该委托的类,下面给出为上例中委托所生成的代码原型:类,下面给出为上例中委托所生成的代码原型:P Public class ublic class MyDelegate:MulticastDelegateMyDelegat
30、e:MulticastDelegate/构造函数构造函数public public MyDelegateMyDelegate(object target,object target,Int32 Int32 methodPtrmethodPtr););/同步调用方法同步调用方法public double virtual public double virtual InvokeInvoke(intint a,a,intint b b););/异步调用方法异步调用方法public virtual public virtual IAsyncResultIAsyncResult BeginInvokeB
31、eginInvoke(intint a,a,intint b,b,AsyncCallbackAsyncCallback callbackDelegatecallbackDelegate,object state);object state);/异步调用后,用来从调用方法中获得返回值异步调用后,用来从调用方法中获得返回值public virtual double public virtual double EndInvokeEndInvoke(IAsyncResultIAsyncResult resultresult););/其他没有显示的成员其他没有显示的成员 理解委托类理解委托类构造函数:构
32、造函数:MyDelegateMyDelegate(object(object target,Int32 target,Int32 methodPtrmethodPtr)构造函数有两个参数。需要注意的是:当程序构造函数有两个参数。需要注意的是:当程序创建委托实例时,它将向构造函数传递一个方创建委托实例时,它将向构造函数传递一个方法名法名(而不是两个参数而不是两个参数).).编译器会负责处理由方编译器会负责处理由方法名生成参数的细节问题法名生成参数的细节问题InvokeInvoke方法:方法:double virtual double virtual InvokeInvoke(intint a,a
33、,intint b)b)默认情况下,调用委托时,编译器会生成对此默认情况下,调用委托时,编译器会生成对此方法的调用。这使得调用列表中的所有方法都方法的调用。这使得调用列表中的所有方法都将被同步调用,调用线程上执行的方法将被阻将被同步调用,调用线程上执行的方法将被阻塞,直到列表中所有方法都已被执行为止塞,直到列表中所有方法都已被执行为止.理解委托类理解委托类BeginInvokeBeginInvoke:IAsyncResultIAsyncResult BeginInvokeBeginInvoke(intint a,a,intint b,b,AsyncCallbackAsyncCallback c
34、allbackDelegatecallbackDelegate,object state);object state);正是这个方法使得委托能支持异步调用。调用这个方法将使委托在单独的正是这个方法使得委托能支持异步调用。调用这个方法将使委托在单独的工作线程上调用其注册的方法工作线程上调用其注册的方法.BeginInvokeBeginInvoke有两个必要的参数:有两个必要的参数:第一个参数是一个第一个参数是一个AsyncCallbackAsyncCallback 委托,该委托指定了在异步方法完成其工委托,该委托指定了在异步方法完成其工作时所要调用的方法;作时所要调用的方法;第二个参数包含一个在
35、方法完成执行时传递给委托的值。第二个参数包含一个在方法完成执行时传递给委托的值。如果不需要回调,则设置这两个参数都为空如果不需要回调,则设置这两个参数都为空(null).(null).委托签名中定义的参数要优先于这两个必要参数委托签名中定义的参数要优先于这两个必要参数.BeginInvokeBeginInvoke方法返回一个对象,该对象实现了方法返回一个对象,该对象实现了IAsyncResultIAsyncResult 接口。该对接口。该对象有两个重要目的:一方面用于获取由异步方法生成的输出,另一方象有两个重要目的:一方面用于获取由异步方法生成的输出,另一方面可以使用其面可以使用其IsComp
36、letedIsCompleted属性监控异步操作是否完成。属性监控异步操作是否完成。理解委托类理解委托类EndInvokeEndInvoke:double double EndInvokeEndInvoke(IAsyncResultIAsyncResult resultresult)调用EndInvoke方法来获取由异步方法返回的结果。调用该方法时,要向它传递一个实现了IAsyncResult 接口的对象,通常都是调用BeginInvoke所返回的哪个对象,以成对使用。该方法可用以下三条语句说明:MyDelegateMyDelegate mdmd=new=new MyDelegate(Divi
37、deMyDelegate(Divide););IAsyncResultIAsyncResult asyncResultasyncResult=md.BeginInvoke(5,2,null,null);=md.BeginInvoke(5,2,null,null);Result=Result=md.EndInvoke(asyncResultmd.EndInvoke(asyncResult););Demo Demo 应用实例应用实例public delegate double public delegate double MyDelegate(intMyDelegate(int a,inta,in
38、t b);b);public class public class SyncDelClassSyncDelClass public double public double Divide(intDivide(int a,inta,int b)b)MessageBox.ShowMessageBox.Show(计算计算 a/b=);a/b=);return a*1.0/b;return a*1.0/b;static void Main()static void Main()MyDelegateMyDelegate mdmd=new=new MyDelegate(sd.DivideMyDelegat
39、e(sd.Divide););double Result=md(5,2);/double Result=md(5,2);/同步委托调用同步委托调用for(intfor(int i=0;i10;i+)i=0;i10;i+)Console.WriteLine(MainConsole.WriteLine(Main method Continuemethod Continue););Console.WriteLine(ResultConsole.WriteLine(Result=0,Result);=0,Result);/异步委托异步委托 调用调用Console.WriteLineConsole.Wr
40、iteLine(以下是异步委托调用以下是异步委托调用););IAsyncResultIAsyncResult asyncResultasyncResult=md.BeginInvoke(5,2,null,null);=md.BeginInvoke(5,2,null,null);for(intfor(int i=0;i100;i+)i=0;i100;i+)Console.WriteLine(MainConsole.WriteLine(Main method Continuemethod Continue););Result=Result=md.EndInvoke(asyncResultmd.En
41、dInvoke(asyncResult););Console.WriteLine(ResultConsole.WriteLine(Result=0,Result);=0,Result);2.2.使用使用ThreadThread类创建线程对象类创建线程对象?在在.NET.NET下,创建和管理多线程程序,主要使用下,创建和管理多线程程序,主要使用封装在封装在System.ThreadingSystem.Threading名称空间下的类和接名称空间下的类和接口,因此,一般先引用口,因此,一般先引用:using using System.ThreadingSystem.Threading;?其中其中,
42、Thread,Thread类是类是ThreadingThreading名称空间下创建和名称空间下创建和管理线程对象最重要的一个类管理线程对象最重要的一个类?通过通过ThreadThread类创建一个线程对象,如下所示:类创建一个线程对象,如下所示:通过通过ThreadThread类创建一个线程对象类创建一个线程对象usingusing Sytem.ThreadingSytem.Threading;/(1)/(1)先定义一个无返回值,无参数的线程方法先定义一个无返回值,无参数的线程方法public void public void ThreadMethodThreadMethod()()/(2)
43、/(2)再定义一个线程委托对象再定义一个线程委托对象,注册一个线程方法注册一个线程方法ThreadStartThreadStart TDelegateTDelegate;TDelegateTDelegate=new=new ThreadStart(ThreadMethodThreadStart(ThreadMethod););/(3)/(3)创建一个创建一个ThreadThread线程对象,将线程委托作为参数线程对象,将线程委托作为参数Thread Thread NewThreadNewThread=new=new Thread(TDelegateThread(TDelegate););/(4
44、)/(4)启动线程对象启动线程对象NewThread.StartNewThread.Start();();通常采用更为简洁的书写形式通常采用更为简洁的书写形式usingusing System;System;usingusing Sytem.ThreadingSytem.Threading;Thread t=new Thread t=new Thread(Thread(newnew ThreadStartThreadStart(ThreadMethod(ThreadMethod););t.startt.start()()Demo Demo 线程对象举例线程对象举例usingusing Syst
45、em.ThreadingSystem.Threading;static void static void ThreadMethodThreadMethod()()/线程方法线程方法,工作线程调用执行工作线程调用执行for(intfor(int i=0;i10;i+)i=0;i10;i+)ThreadstrThreadstr=Thread.CurrentThread.GetHashCode().ToStringThread.CurrentThread.GetHashCode().ToString();();ThreadstrThreadstr+=+=,第,第+i.ToStringi.ToStri
46、ng()+()+循环循环;MessageBox.Show(ThreadstrMessageBox.Show(Threadstr););static void Main()static void Main()/主函数,主线程调用执行主函数,主线程调用执行Thread t=new Thread t=new Thread(newThread(new ThreadStart(ThreadMethodThreadStart(ThreadMethod););t.Startt.Start();();Console.WriteLineConsole.WriteLine(主线程号主线程号:0,Thread.Cu
47、rrentThread.GetHashCode();:0,Thread.CurrentThread.GetHashCode();for(intfor(int i=0;i10;i+)i=0;i10;i+)Console.WriteLineConsole.WriteLine(主线程执行第主线程执行第00次循环次循环,i);,i);Demo Demo 举例举例using using System.ThreadingSystem.Threading;public static void public static void ThreadMethodThreadMethod()()/线程方法线程方法,工
48、作线程调用执行工作线程调用执行for(intfor(int i=0;i10;i+)i=0;i10;i+)ThreadstrThreadstr=Thread.CurrentThread.GetHashCode().ToStringThread.CurrentThread.GetHashCode().ToString();();ThreadstrThreadstr+=+=,第,第+i.ToStringi.ToString()+()+循环循环;MessageBox.Show(ThreadstrMessageBox.Show(Threadstr););public static void Main()
49、public static void Main()/主函数,主线程调用执行主函数,主线程调用执行Thread t=new Thread t=new Thread(newThread(new ThreadStart(ThreadMethodThreadStart(ThreadMethod););t.Startt.Start();();Console.WriteLineConsole.WriteLine(主线程号主线程号:0,Thread.CurrentThread.GetHashCode();:0,Thread.CurrentThread.GetHashCode();for(intfor(int
50、 i=0;i10;i+)i=0;i10;i+)Console.WriteLineConsole.WriteLine(主线程执行第主线程执行第00次循环次循环,i);,i);Thread.Sleep(0);Thread.Sleep(0);Console.WriteLine(Main thread:Call Join(),to wait until ThreaConsole.WriteLine(Main thread:Call Join(),to wait until ThreadProc end!);dProc end!);t.Joint.Join();();Console.WriteLine(