多线程学习笔记
一、多线程简介
我们所说的 Windows是一个多任务操作系统,是说Windows能同时执行多个程序。当我们每运行一个程序的时候其实就开启了一个进程,进程中包含了这个程序运行所需要的文本代码、变量和动态分配的内存、堆栈等资源,进程之间先对独立,一个进程不会干扰另一个进程的运行。在.net中进程可以包含多个应用程序域和线程,应用程序域是一个逻辑区域(不做详细介绍)。线程是进程中的基本执行单元,线程可以帮一个进程同时做多件事,线程主要由线程ID,当前指令指针(PC),寄存器集合和堆栈组成,同一进程的多个线程可以在宏观上并发的执行,但在微观上CPU同时只能执行一个线程,所以线程也就有了就绪,阻塞,运行三种状态,具体CPU执行那个线程这由系统根据线程的优先级决定。程序入口的线程叫主线程,在.net中就是Main()方法作为入口的,调用Main()方法系统就会创建一个主线程。
所谓多线程就是在一个进程内运行多个线程来协同完成工作,这样能在一定程度上提高程序的性能,最明显的就是在做winform开发的时候,如果不用多线程,当我们处理数据的时候程序界面是卡死的,这就是因为在只有一个线程的时候,处理数据的和UI是在一个线程(主线程)中,但处理数据的时候这个线程是不会去处理前台UI的,所以我们会感觉程序卡死了。多线程的缺点就是CPU要花时间来处理要执行那个线程.....
二、.net多线程操作
在.net中操作多线程就必须用到Thread类了,Thread包含在System.Threading命名空间中。System.Threading命名空间包含了多线程所需要的类库,其中Thread和ThreadPool是经常用到的。创建多线程就是同多Thread提供的方法执行方法的委托。在.net中创建线程最简单的方法就是用Thread的ThreadStart委托开启新的线程,ThreadStart委托定义为public delegate void ThreadStart(),就是说该委托只能接受返回值为void并且没有参数的方法,当然如果要多线程执行带有参数的可以使用ParameterizedThreadStart委托,能接受返回值为void参数为object的参数。
1、通过Thread常用到的属性和方法
属性:
CurrentContext 获取线程正在其中执行的当前上下文。
CurrentThread 获取当前正在运行的线程。
IsAlive 获取一个值,该值指示当前线程的执行状态。
IsBackground 获取或设置一个值,该值指示某个线程是否为后台线程。
ManagedThreadId 获取当前托管线程的唯一标识符。
Name 获取或设置线程的名称。,可以没有。
Priority 获取或设置一个值,该值指示线程的调度优先级。。
ThreadState 获取一个值,该值包含当前线程的状态。
方法:
Abort() 终止本线程。
Join() 阻塞调用线程,直到某个线程终止时为止。
Resume() 继续运行已挂起的线程。
Start() 执行本线程。
Suspend() 挂起当前线程,如果当前线程已属于挂起状态则此不起作用。
Sleep() 把正在运行的线程挂起一段时间。
2、通过ThreadStart创建线程
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Thread thread = Thread.CurrentThread; 6 Console.WriteLine("主线程" + thread.ManagedThreadId + "开始工作了"); 7 Person p = new Person(); 8 p.Name = "张三"; 9 Thread person_thread = new Thread(new ThreadStart(p.Message)); 10 person_thread.Start(); 11 int i = 0; 12 while (true) 13 { 14 Console.WriteLine("主线程在工作"); 15 Thread.Sleep(500); 16 i++; 17 if(i>30) 18 { 19 Console.WriteLine("主线程停止了工作"); 20 break; 21 } 22 } 23 Console.ReadKey(); 24 } 25 }
1 class Person 2 { 3 public string Name { get; set; } 4 public void Message() 5 { 6 //获取当前线程 7 Thread thread = Thread.CurrentThread; 8 Console.WriteLine("线程"+thread.ManagedThreadId + "开始工作了"); 9 int i=0; 10 while (true) 11 { 12 i++; 13 if (!String.IsNullOrEmpty(Name)) 14 { 15 Console.WriteLine(Name + "在数数~~" + i.ToString()+" 线程ID"+thread.ManagedThreadId); 16 } 17 //线程挂起500毫秒 18 Thread.Sleep(500); 19 if (i > 30) 20 { 21 Console.WriteLine(Name + "数到了~~" + i.ToString() + "结束!" + " 线程ID" + thread.ManagedThreadId); 22 break; 23 } 24 } 25 } 26 }
运行结果是
可见执行Person类Message方法的线程和主线程在并行的执行。