首页 技术 正文
技术 2022年11月21日
0 收藏 992 点赞 2,675 浏览 1694 个字

之前的两篇文章我们了解了委托和事件,本文我们看一下线程。

1,一个窗体程序,默认拥有一个线程(相当于一个商店里面,只有一个店员),这个默认的线程叫做 UI线程/主线程。

2,进程和线程的关系:

  A,进程,包含程序运行所需要的资源 ,在大多数情况下是指 程序。(商店:囤积要使用的资源的地方)

  B,线程,是在进程中能够被CPU调用的程序单元,是提供给CPU运行程序的代码片段。(商店员工:是运行程序的行动者)

  C,一个进程至少一个线程,每一个线程有自己专属的寄存器(栈指针、程序计数器等)但代码区是共享的,不同的线程可以执行同样的函数

  D,同一进程中的多个线程之间可以“并发”执行

【.NET基础】–委托、事件、线程(3)

3,多线程的目的:

  A,让CPU主动执行不同的程序单元,这样就不至于被某个程序的恶意代码引起死机症状

  B,让计算机“同时”做多个事情,节约时间

  C,CPU在不同的线程里面切换,在不同的进程里面切换

5,线程的调度方式:

  A,非抢占式调度:是指某个线程在运行的过程中不会被操作系统强制性暂停,线程可以一直运行到告一段落或者主动交出运行权。线程的运行完全是单队列的(像排序买票一样),这样可能产生恶意程序长期霸占运行权的情况,而且一旦一个程序死掉了,电脑只能重启了。

  B,抢占式调度:每个线程有极少的运行时间(在Windows内核模式下这个时间不会超过20ms),当时间用完的时候线程就会被强制暂停,保存上下文并把CPU的运行权交给下一个线程,这样调度的结果就是所有的线程都在被快速的切换运行,这样给客户端的感觉就是线程在“并行同时” 运行。

  C, 线程的调用由CPU决定,所以调用Thread实例的Start方法,标记该线程可以被CPU执行了,但具体执行时间由CPU决定。

【.NET基础】–委托、事件、线程(3)

6,线程切换的时候保存线程当前的执行状态,也就是线程当前的执行会话

   线程中的寄存器存在当前执行的代码号,堆栈存储当前运行的变量的值。当CPU执行再次回到这个线程的时候读取之前寄存器和堆栈中保存的数据。

   程序代码,编译以后是CPU的指令集,CPU对指定集执行只读操作。 如下图:

 【.NET基础】–委托、事件、线程(3)

7,如何实现多线程?

  A, 编写产生线程需要执行的方法

  B,引用System.Threading命名空间

  C,实例化Thread类,并传入一个指向线程所需要运行方法的委托(线程已经产生,还没有开始运行)

  D,调用Tread实例的Start方法,标记该线程可以被CPU执行了(具体执行时间由CPU决定)

 /// <summary>
/// 多线程
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnThread_Click(object sender, EventArgs e)
{
//1,创建线程并通过委托语法糖 传入方法
Thread thrSon = new Thread(CountDo);
//2,设置为后台线程
thrSon.IsBackground = true;
//3,启动线程
thrSon.Start();
} void CountDo()
{
int i = ;
while (true)
{
if (i < )
{
i++;
}
else
{
break;
}
}
MessageBox.Show("计算完毕:" + i);
}

8,线程到底是什么?

  线程是存储单元,是存储在内存中的空间,存储的是任务列表,要去做什么事情!这些任务交给CPU去做。CPU决定什么时候去做。

  线程是帮助CPU完成抢断式执行的基础数据类型,用来存储CPU每次执行未完成时需要保存的代码执行信息。(如:正在执行哪个方法?执行到第几行了?方法里的变量值为什么?)

9,Thread类的一些重要成员

  • Start()启动线程
  • Abort()终止线程
  • Thread.Sleep(100)静态方法,可以让当前线程停止一段时间运行(毫秒)
  • Name线程名
  • Thread.CurrentThread获得当前线程的引用
  • 前台线程 和 后台线程

10,多线程的消耗

  线程之间切换需要保存当前执行状态,以及读取切换前的执行状态,这个多线程的消耗。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,992
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,506
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,349
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,134
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,766
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,844