zoukankan      html  css  js  c++  java
  • 多线程学习笔记

    一、多线程简介

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

  • 相关阅读:
    rest webapi 返回数据
    下载指定路径的文件到本地服务器
    NPOI excel文件解析
    (Demo分享)利用JavaScript(JS)实现一个九宫格拖拽功能
    关于DOM的理解
    (Demo分享)利用JavaScript(JS)做一个可输入分钟的倒计时钟功能
    关于闭包函数和递归函数的详细理解
    纯CSS制作加<div>制作动画版哆啦A梦
    冒泡排序
    Python常用模块及正则表达式知识点,你需要了解的全在这了
  • 原文地址:https://www.cnblogs.com/yyzq/p/2951776.html
Copyright © 2011-2022 走看看