七天学习计划_c#_[6][7]多线程
- 进程:一个正在运行的程序就是一个进程。操作系统根据进程分配各种资源(内存…)
首先打开任务管理器,查看当前运行的进程:
从任务管理器里面可以看到当前所有正在运行的进程。那么究竟什么是进程呢?
进程(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]多线程相关推荐
- 七天学习计划_c#_[1]泛型类(还有六天,明天继续写!)
泛型类 泛型的好处:增加类型安全,带来编码的方便: 常见的泛型:泛型类和泛型方法: 后续深入:泛型委托(自定义泛型委托.常见的泛型委托Func.Action) 泛型类的规范:public cl ...
- 七天学习计划_c#_[2][3][4][5]委托、事件、委托与事件的区别、泛型委托、Func\Action\predicate
由于委托之前的博客已经详细写了,这里就简单的过一遍,复习一下: 了解委托 基于委托开发事件驱动程序变得非常简单. 使用委托可以大大简化多线程编程难度. 理解委托 委托也可以看做成一种数据类型,可以定义 ...
- C/C++学习之路_七: 内存管理
C/C++学习之路_七: 内存管理 目录 作用域 内存布局 内存分区代码分析 1. 作用域 C语言变量的作用域分为: 代码块作用域(代码块是{}之间的一段代码) 函数作用域 文件作用域 1. 局部变量 ...
- 执行计划有时不准确_高效学习计划的制定原则和分类执行方法
学习计划不仅关系到每一天的学习,详尽的学习计划甚至关系到每一节课的学习,只有制定合理的学习计划,并严格执行下去,经过长时间的坚持,才能形成良好的学习习惯,下面就是高效学习计划的制定原则和分类执行方法, ...
- 学生每日计划表_小学生每日学习计划表格怎么制定
小学生每日学习计划表格怎么制定 导读:小编根据大家的需要整理了一份关于<小学生每日学习计划表格怎么制定>的内容,具体内容:长期按学习计划办事,就会使每天的学习生活很有规律,甚至逐渐形成条件 ...
- 软件开发人员的学习计划_经常与开发人员混在一起培养创新和学习的文化
软件开发人员的学习计划 Without skilled developers, the Scrum Framework is no more than lipstick on a pig. Havin ...
- 六年级上计算机课程计划书,六年级学习计划书_小学六年级学习计划范文
想要更高效地学习,大家可以提前制定好一份学习计划.下面是小编整理的六年级学习计划书,欢迎大家参考! 1.我认为,我目前最大的毛病就是上课不认真听讲.总是在课堂上摆着一个认真听讲的架子,但脑子却早已想别 ...
- liu四声拼音怎么读_拼音是99%的西安孩子幼升小必备知识!附:幼小拼音学习计划...
在西安本地幼升小考试中,90%的小学试题都会涉及拼音知识内容.2015年高新一小幼升小入学考试第一题为"请默写拼音中的声母和韵母." 2016年高新三小幼升小试题中考察拼音的方式为 ...
- 转发:Datawhale第七期组队学习计划
编者注:Datawhale是一个公益组织,也是AiUnion的四个成员之一,所有学习计划是免费的. 第7期Datawhale组队学习计划 马上就要开始啦 这次共组织15个组队学习 涵盖了AI领域从理论 ...
最新文章
- js 点击侧边栏展示内容_【DEMO】JS实现侧边栏信息展示效果
- Service的理解和使用
- vs工程移植报错:缺少MSVCP140D.dll ,CONCRT140D.dll ucrtbased.dll vcruntime140d.dll错误。
- 转载 300年前的黑色“巫女”
- Oracle:ORA-28000异常(帐户已被锁定),修改账号登录失败次数
- 腾讯天衍实验室新算法入选国际万维网大会 新冠疫苗AI问答上线
- potplayer播放器的下载与截图配置
- 计算机换位加密,基于位平面变换的数字图像加密算法
- pdf文档转word/excel/ppt/图片,pdf加解密,pdf添加水印,pdf拆分合并
- Golang interface接口深入理解
- php怎么弄面包屑,php实现面包屑导航例子分享
- Hadoop(八)网站流量分析
- 计算机桌面窗口管理器在哪,W7系统禁用dwm桌面窗口管理器的操作方法
- 如何在一周内快速摸清一个行业?
- 怎样学计算机打字最快,怎样学电脑快速打字
- pythonstdin_关于python:从sys.stdin接收输入,非阻塞
- .net7二维码跨平台完美解决方案
- iOS查询iTunes中国商店的APP信息
- 古琴入门基础知识【古琴打谱的方法一】——唐畅古琴
- 2023新UI付费测算程序源码+宝宝起名/星座运势等等
热门文章
- TMS320C6678中Hyperlink接口的理解
- 射频领域中交调和互调的区别
- RS485,RS232,USB,Ethernet 传输速度分别是多少
- PCI总线和PXI总线的区别
- 深入浅出解释FFT(一)——用fft求频谱
- 场效应管的判别、检测及使用时的注意事项!
- ADS与RealView MDK
- CosmoMC命令CAMB文件画功率谱
- 《工业控制网络安全技术与实践》一2.1.3 SCADA 系统未来的技术发展
- [ASP.NET MVC3.0]Contact Manager 之迭代开发 一