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

一 线程基础

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. System.Collections.Generic 源码阅读总结

    ArrayList ,List ArrayList 和 List 都是不限制长度的集合类型 ,List相比ArrayList 就内部实现而言除了泛型本质没有太大区别.不过为避免装箱拆箱问题,尽可能使用 ...

  2. SpringBoot跨域小结

    前言:公司的SpringBoot项目出于某种原因,经常样处理一些跨域请求. 一.以前通过查阅相关资料自己写的一个处理跨域的类,如下. 1.1首先定义一个filter(拦截所有请求,包括跨域请求) pu ...

  3. js学习笔记----JavaScript中DOM扩展的那些事

    什么都不说,先上总结的图~   Selectors API(选择符API) querySelector()方法 接收一个css选择符,返回与该模式匹配的第一个元素,如果没有找到匹配的元素,返回null ...

  4. keras中的mini-batch gradient descent (转)

    深度学习的优化算法,说白了就是梯度下降.每次的参数更新有两种方式. 一. 第一种,遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度.这种方法每更新一次参数都要把数据集里的所有样本都看 ...

  5. Django--Session 操作

    Session Session的由来 Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要 ...

  6. JVM 监控,调优,调试

    JVM监控工具 Java的安装包自带了很多优秀的工具,善用这些工具对于监控和调试Java程序非常有帮助.常用工具如下: jps 用途:jps用来查看JVM里面所有进程的具体状态, 包括进程ID,进程启 ...

  7. java反转链表

    /** * 遍历,将当前节点的下一个节点缓存后更改当前节点指针 */ public static Node reverse2(Node head) { if (head == null) return ...

  8. leetcode — palindrome-number

    import org.lep.leetcode.parseint.IntegerParser; /** * Source : https://oj.leetcode.com/problems/pali ...

  9. 域名系统DNS简介

    域名系统(Domain Name System, DNS)是互联网的核心应用层协议之一, 它用于查询域名对应的IP地址.在使用域名访问任何网络资源时都需要先进行域名解析. www.cnblogs.co ...

  10. MVC中 jquery.validate取消忽略对hidden的验证

    <script type="text/javascript"> $.validator.setDefaults({ //取消 忽略对hidden的验证 ignore: ...