通过将一个任务划分成多个任务分别在独立的线程执行可以更有效地利用处理器资源并节省时间。但如果不合理地使用多线程,反而会带来种种问题并拖慢运行速度。

一 线程基础

a)线程与多任务

一个线程就是一个处理单元,多任务时多个线程会同时执行。多任务时会涉及到任务间的合作与优先级的问题。Windows NT内核的操作系统使用抢占多任务处理机制(preemptivemultitasking),系统会为每个线程划分出确定的执行时间(时间片),然后线程在给定的时间片内轮流执行。

在单核处理器上使用多线程时,线程只是被轮流执行,但给人的感觉好像是在同时执行;如果是在多核或者多个处理器上运行多线程,线程会真正同时运行。

b)上下文切换(Context Switching)

对于多线程来说,上下文切换是不可或缺的功能。当一个时间片被用完时处理器会发出中断信号,处理器将当前线程相关的内容保存到栈上,然后将下一个线程的相关内容从栈上读取到CONTEXT数据结构中,如果时间片用尽,又会切换CONTEXT中装载的线程。

c)多线程的使用

一个简单的多线程使用示例如下:

ThreadStartworker = new ThreadStart(WorkerThreadMethod);这样的写法在委托一章接触过,xvarName=new x (methodName)这样的形式表示初始化了一个x类型的委托,并指向methodName方法。

在实例化Thread时,必须传递ThreadStart类型的委托作为参数。调用Thread.Start方法后,ThreadStart指向的方法就会在另一个线程被执行。

二 System.Threading.Thread类

a)AppDomain(应用程序域)

AppDomain与win32进程有不少类似的地方,但在win32中,一个线程被限制在特定的进程中,不同进程间线程无法交互。而AppDomain中的线程可以跨域通信,或者调用其它AppDomain中的方法。所以,AppDomain相当于是在物理进程中的逻辑进程。

b)有两种方式可以拿到线程实例,一种是使用关键字new,另一种是使用Thread.CurrentThread取得正在执行的线程。可以使用Thread.Sleep方法来让线程挂起指定的时间,这个方法是静态的。如果为Thread.Sleep方法传递的参数为0,当前线程会主动释放尚未用完的时间片;如果为其传递Timeout.Infinite(值为-1的常量),那么当前线程会被无限期地暂停,直到有另一个线程对其实例调用Thread.Interrupt方法。Thread.Suspend方法也可以让线程挂起,但不是静态方法,要由另一个线程调用,与之配合的方法还有Thread.Resume。

c)Thread.Abort方法可以销毁线程,系统内部通过抛出ThreadAbortException异常来终止线程。ThreadAbortException比较特殊,是无法被捕获的。Abort后,线程不会立即停止,会等到将当前工作完成,达到”safe

point”后才退出。在多线程编程中,为了可靠地知道某个线程是否已终止,可以使用Thread.Join方法,这个方法直到线程被销毁后才返回。另外一旦线程被销毁,就无法被重新启动的。

学习资料:Inside C# by Tom Archer

《Inside C#》笔记(十三) 多线程 上的更多相关文章

  1. 《Inside C#》笔记(十三) 多线程 下

    一 任务调度 当一个线程的时间片被用尽后,处理器会切换到另一个线程,但关于如何确定执行哪一个线程呢,这就涉及到了线程或任务的优先级. a) 每个线程都有优先级,任务调度算法会根据各线程的不同优先级来决 ...

  2. python学习笔记(十三): 多线程多进程

    一.线程&进程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程, ...

  3. 孙鑫VC学习笔记:多线程编程

    孙鑫VC学习笔记:多线程编程 SkySeraph Dec 11st 2010  HQU Email:zgzhaobo@gmail.com    QQ:452728574 Latest Modified ...

  4. python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容

    python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI,采用Python语言编写 ...

  5. java之jvm学习笔记十三(jvm基本结构)

    java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...

  6. 《C++游戏开发》笔记十三 平滑过渡的战争迷雾(一) 原理:Warcraft3地形拼接算法

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9611887 作者:七十一雾央 新浪微博:http:/ ...

  7. Go语言学习笔记十三: Map集合

    Go语言学习笔记十三: Map集合 Map在每种语言中基本都有,Java中是属于集合类Map,其包括HashMap, TreeMap等.而Python语言直接就属于一种类型,写法上比Java还简单. ...

  8. SpringMVC:学习笔记(8)——文件上传

    SpringMVC--文件上传 说明: 文件上传的途径 文件上传主要有两种方式: 1.使用Apache Commons FileUpload元件. 2.利用Servlet3.0及其更高版本的内置支持. ...

  9. C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用

    C#面试题(转载) 原文地址:100道C#面试题(.net开发人员必备)  https://blog.csdn.net/u013519551/article/details/51220841 1. . ...

随机推荐

  1. 首页背景图片在PC端有显示,在手机端不显示的解决方法

    今天看博客的资源大小,发现背景图片有44k大的吓人,准备压缩一下. 压缩之后才发现,我的背景图片在手机端是没有显示的.原因是背景图片不支持缩放. 上网查了下,发现加入如下代码之后就支持缩放了: bac ...

  2. LabVIEW(十六):多列列表框控件

    1.多列列表框控件:前面板右键>列表.表格和树>多列列表框2.默认情况下只显示列首,可设置显示行首:前面板选中多列列表框右键>显示>行首3.LabVIEW中提供42种自带的图标 ...

  3. Shell-14--awk

    awk ' 条件1{ 动作1} 条件2{动作2}...' 文件名 awk处理数据是 先读取第一行 然后再去处理 printf 不会加入换行符,需要手动加入 print 会自动加换行 begin 是在后 ...

  4. 转载 Python 正则表达式入门(中级篇)

    Python 正则表达式入门(中级篇) 初级篇链接:http://www.cnblogs.com/chuxiuhong/p/5885073.html 上一篇我们说在这一篇里,我们会介绍子表达式,向前向 ...

  5. 机器学习与Tensorflow(4)——卷积神经网络与tensorflow实现

    1.标准卷积神经网络 标准的卷积神经网络由输入层.卷积层(convolutional layer).下采样层(downsampling layer).全连接层(fully—connected laye ...

  6. Python函数学习——匿名函数

    匿名函数 匿名函数就是不需要显式的指定函数名. 关键字lambda表示匿名函数,冒号前面的n表示函数参数,可以有多个参数. 匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达 ...

  7. 抽象语法树(AST)

    AST描述 在计算机科学中,抽象语法树(AST)或语法树是用编程语言编写的源代码的抽象语法结构的树表示.树的每个节点表示在源代码中出现的构造.语法是“抽象的”,因为它不代表真实语法中出现的每个细节,而 ...

  8. linux中一些简便的命令之tac/comm

    tac tac是cat的反写,即反序显示文件内容 如文件a.txt内容如下: 1 2 3 4 5 则tac a.txt打印如下: 54321 我们可以使用awk来实现tac的功能: awk '{arr ...

  9. 使用.NET Core与Google Optimization Tools实现加工车间任务规划

    前一篇文章<使用.NET Core与Google Optimization Tools实现员工排班计划Scheduling>算是一种针对内容的规划,而针对时间顺序任务规划,加工车间的工活儿 ...

  10. TCP/IP 笔记 - 链路层

    链路层的目的是为IP模块发送和接收IP数据报. 以太网和IEEE 802局域网标准 以太网指的是一套标准,有DEC.Intel公司和Xerox公司在1980年首次发布,并在1982年加以修订.第一个常 ...