• 进程:一个正在运行的程序就是一个进程。操作系统根据进程分配各种资源(内存…)

首先打开任务管理器,查看当前运行的进程:

从任务管理器里面可以看到当前所有正在运行的进程。那么究竟什么是进程呢?

进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。线程是操作系统分配处理器时间的基本单元,在进程中可以有多个线程同时执行代码。进程之间是相对独立的,一个进程无法访问另一个进程的数据(除非利用分布式计算方式),一个进程运行的失败也不会影响其他进程的运行,Windows系统就是利用进程把工作划分为多个独立的区域的。进程可以理解为一个程序的基本边界。是应用程序的一个运行例程,是应用程序的一次动态执行过程。

  • 线程

在任务管理器里面查询当前总共运行的线程数:

线程(Thread)是进程中的基本执行单元,是操作系统分配CPU时间的基本单位,一个进程可以包含若干个线程,在进程入口执行的第一个线程被视为这个进程的主线程。在.NET应用程序中,都是以Main()方法作为入口的,当调用此方法时系统就会自动创建一个主线程。线程主要是由CPU寄存器、调用栈和线程本地存储器(Thread Local Storage,TLS)组成的。CPU寄存器主要记录当前所执行线程的状态,调用栈主要用于维护线程所调用到的内存与数据,TLS主要用于存放线程的状态信息。

线程:操作系统为了提高效率会将一个进程分成多个线程,并按照线程来分配CPU执行时间

线程特点:在具有多线程CPU的计算机中,可以并行执行。

ThreadStart 委托定义:(下图)

Thread类:表示托管线程,每一个Thread对象都代表一个托管线程,每个托管线程会对应一个函数。

创建多线程的步骤:
1、编写线程所要执行的方法
2、实例化Thread类,并传入一个指向线程所要执行方法的委托。(这时线程已经产生,但还没有运行)
3、调用Thread实例的Start方法,标记该线程可以被CPU执行了,但具体执行时间由CPU决定

简单事例:

class Program
{static void Main(string[] args){hreadDemoClass demoClass = new ThreadDemoClass();//创建一个新的线程Thread thread = new Thread(demoClass.Run);//设置为后台线程thread.IsBackground = true;//开始线程thread.Start();Console.WriteLine("Main thread working...");Console.WriteLine("Main thread ID is:" +                 Thread.CurrentThread.ManagedThreadId.ToString());//主线程Console.ReadKey();}
}public class ThreadDemoClass
{public void Run(){Console.WriteLine("Child thread working...");Console.WriteLine("Child thread ID is:" +         Thread.CurrentThread.ManagedThreadId.ToString());//子线程}
}

执行结果:

前台线程和后台线程

前台线程:只有所有的前台线程都结束,应用程序才能结束。默认情况下创建的线程都是前台线程。
后台线程:只要所有的前台线程结束,后台线程自动结束。通过Thread.IsBackground设置后台线程。必须在调用Start方法之前设置线程的类型,否则一旦线程运行,将无法改变其类型。

 1     class Program2     {3         static void Main(string[] args)4         {                   5             //演示前台、后台线程6             BackGroundTest background = new BackGroundTest(10);7             //创建前台线程8             Thread fThread = new Thread(new ThreadStart(background.RunLoop));9             //给线程命名
10             fThread.Name = "前台线程";
11
12
13             BackGroundTest background1 = new BackGroundTest(20);
14             //创建后台线程
15             Thread bThread = new Thread(new ThreadStart(background1.RunLoop));
16             bThread.Name = "后台线程";
17             //设置为后台线程
18             bThread.IsBackground = true;
19
20             //启动线程
21             fThread.Start();
22             bThread.Start();
23         }
24     }
25
26     class BackGroundTest
27     {
28         private int Count;
29         public BackGroundTest(int count)
30         {
31             this.Count = count;
32         }
33         public void RunLoop()
34         {
35             //获取当前线程的名称
36             string threadName = Thread.CurrentThread.Name;
37             for (int i = 0; i < Count; i++)
38             {
39                 Console.WriteLine("{0}计数:{1}",threadName,i.ToString());
40                 //线程休眠500毫秒
41                 Thread.Sleep(1000);
42             }
43             Console.WriteLine("{0}完成计数",threadName);
44
45         }
46     }

运行结果:前台线程执行完,后台线程未执行完,程序自动结束。

把bThread.IsBackground = true注释掉,运行结果:主线程执行完毕后(Main函数),程序并未结束,而是要等所有的前台线程结束以后才会结束。

后台线程一般用于处理不重要的事情,应用程序结束时,后台线程是否执行完成对整个应用程序没有影响。如果要执行的事情很重要,需要将线程设置为前台线程。

七天学习计划_c#_[6][7]多线程相关推荐

  1. 七天学习计划_c#_[1]泛型类(还有六天,明天继续写!)

    泛型类     泛型的好处:增加类型安全,带来编码的方便: 常见的泛型:泛型类和泛型方法: 后续深入:泛型委托(自定义泛型委托.常见的泛型委托Func.Action) 泛型类的规范:public cl ...

  2. 七天学习计划_c#_[2][3][4][5]委托、事件、委托与事件的区别、泛型委托、Func\Action\predicate

    由于委托之前的博客已经详细写了,这里就简单的过一遍,复习一下: 了解委托 基于委托开发事件驱动程序变得非常简单. 使用委托可以大大简化多线程编程难度. 理解委托 委托也可以看做成一种数据类型,可以定义 ...

  3. C/C++学习之路_七: 内存管理

    C/C++学习之路_七: 内存管理 目录 作用域 内存布局 内存分区代码分析 1. 作用域 C语言变量的作用域分为: 代码块作用域(代码块是{}之间的一段代码) 函数作用域 文件作用域 1. 局部变量 ...

  4. 执行计划有时不准确_高效学习计划的制定原则和分类执行方法

    学习计划不仅关系到每一天的学习,详尽的学习计划甚至关系到每一节课的学习,只有制定合理的学习计划,并严格执行下去,经过长时间的坚持,才能形成良好的学习习惯,下面就是高效学习计划的制定原则和分类执行方法, ...

  5. 学生每日计划表_小学生每日学习计划表格怎么制定

    小学生每日学习计划表格怎么制定 导读:小编根据大家的需要整理了一份关于<小学生每日学习计划表格怎么制定>的内容,具体内容:长期按学习计划办事,就会使每天的学习生活很有规律,甚至逐渐形成条件 ...

  6. 软件开发人员的学习计划_经常与开发人员混在一起培养创新和学习的文化

    软件开发人员的学习计划 Without skilled developers, the Scrum Framework is no more than lipstick on a pig. Havin ...

  7. 六年级上计算机课程计划书,六年级学习计划书_小学六年级学习计划范文

    想要更高效地学习,大家可以提前制定好一份学习计划.下面是小编整理的六年级学习计划书,欢迎大家参考! 1.我认为,我目前最大的毛病就是上课不认真听讲.总是在课堂上摆着一个认真听讲的架子,但脑子却早已想别 ...

  8. liu四声拼音怎么读_拼音是99%的西安孩子幼升小必备知识!附:幼小拼音学习计划...

    在西安本地幼升小考试中,90%的小学试题都会涉及拼音知识内容.2015年高新一小幼升小入学考试第一题为"请默写拼音中的声母和韵母." 2016年高新三小幼升小试题中考察拼音的方式为 ...

  9. 转发:Datawhale第七期组队学习计划

    编者注:Datawhale是一个公益组织,也是AiUnion的四个成员之一,所有学习计划是免费的. 第7期Datawhale组队学习计划 马上就要开始啦 这次共组织15个组队学习 涵盖了AI领域从理论 ...

最新文章

  1. js 点击侧边栏展示内容_【DEMO】JS实现侧边栏信息展示效果
  2. Service的理解和使用
  3. vs工程移植报错:缺少MSVCP140D.dll ,CONCRT140D.dll ucrtbased.dll vcruntime140d.dll错误。
  4. 转载 300年前的黑色“巫女”
  5. Oracle:ORA-28000异常(帐户已被锁定),修改账号登录失败次数
  6. 腾讯天衍实验室新算法入选国际万维网大会 新冠疫苗AI问答上线
  7. potplayer播放器的下载与截图配置
  8. 计算机换位加密,基于位平面变换的数字图像加密算法
  9. pdf文档转word/excel/ppt/图片,pdf加解密,pdf添加水印,pdf拆分合并
  10. Golang interface接口深入理解
  11. php怎么弄面包屑,php实现面包屑导航例子分享
  12. Hadoop(八)网站流量分析
  13. 计算机桌面窗口管理器在哪,W7系统禁用dwm桌面窗口管理器的操作方法
  14. 如何在一周内快速摸清一个行业?
  15. 怎样学计算机打字最快,怎样学电脑快速打字
  16. pythonstdin_关于python:从sys.stdin接收输入,非阻塞
  17. .net7二维码跨平台完美解决方案
  18. iOS查询iTunes中国商店的APP信息
  19. 古琴入门基础知识【古琴打谱的方法一】——唐畅古琴
  20. 2023新UI付费测算程序源码+宝宝起名/星座运势等等

热门文章

  1. TMS320C6678中Hyperlink接口的理解
  2. 射频领域中交调和互调的区别
  3. RS485,RS232,USB,Ethernet 传输速度分别是多少
  4. PCI总线和PXI总线的区别
  5. 深入浅出解释FFT(一)——用fft求频谱
  6. 场效应管的判别、检测及使用时的注意事项!
  7. ADS与RealView MDK
  8. CosmoMC命令CAMB文件画功率谱
  9. 《工业控制网络安全技术与实践》一2.1.3 SCADA 系统未来的技术发展
  10. [ASP.NET MVC3.0]Contact Manager 之迭代开发 一