多线程学习笔记

…衆ロ難τιáo~ 提交于 2020-04-02 21:42:51

一、多线程简介

  我们所说的 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方法的线程和主线程在并行的执行。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!