《Inside C#》笔记(十三) 多线程 上
通过将一个任务划分成多个任务分别在独立的线程执行可以更有效地利用处理器资源并节省时间。但如果不合理地使用多线程,反而会带来种种问题并拖慢运行速度。
一 线程基础
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#》笔记(十三) 多线程 上的更多相关文章
- 《Inside C#》笔记(十三) 多线程 下
一 任务调度 当一个线程的时间片被用尽后,处理器会切换到另一个线程,但关于如何确定执行哪一个线程呢,这就涉及到了线程或任务的优先级. a) 每个线程都有优先级,任务调度算法会根据各线程的不同优先级来决 ...
- python学习笔记(十三): 多线程多进程
一.线程&进程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程, ...
- 孙鑫VC学习笔记:多线程编程
孙鑫VC学习笔记:多线程编程 SkySeraph Dec 11st 2010 HQU Email:zgzhaobo@gmail.com QQ:452728574 Latest Modified ...
- python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容
python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI,采用Python语言编写 ...
- java之jvm学习笔记十三(jvm基本结构)
java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...
- 《C++游戏开发》笔记十三 平滑过渡的战争迷雾(一) 原理:Warcraft3地形拼接算法
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9611887 作者:七十一雾央 新浪微博:http:/ ...
- Go语言学习笔记十三: Map集合
Go语言学习笔记十三: Map集合 Map在每种语言中基本都有,Java中是属于集合类Map,其包括HashMap, TreeMap等.而Python语言直接就属于一种类型,写法上比Java还简单. ...
- SpringMVC:学习笔记(8)——文件上传
SpringMVC--文件上传 说明: 文件上传的途径 文件上传主要有两种方式: 1.使用Apache Commons FileUpload元件. 2.利用Servlet3.0及其更高版本的内置支持. ...
- C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用
C#面试题(转载) 原文地址:100道C#面试题(.net开发人员必备) https://blog.csdn.net/u013519551/article/details/51220841 1. . ...
随机推荐
- Linux下MySQL的简单操作
Linux下MySQL的简单操作 更改mysql数据库root的密码 首次进入数据库是不用密码的: [root@localhost ~]# /usr/local/mysql/bin/mysql -ur ...
- linux内核中GNU C __attribute__ 机制的实用
很多东西,只看看是不行的,要想深入的去了解一个东西,一定要去不断地学习,实践,反思. 说白了就是要去打磨. 在linux中,最近遇到了这样一个定义: int board_usb_init(int in ...
- Java访问文件夹中文件的递归遍历代码Demo
上代码: import java.io.File; /* * 需求:对指定目录进行所有内容的列出(包含子目录中的内容) * 也可以理解为 深度遍历. */ public class FindAllFi ...
- 使用SonarCloud对.NET Core项目进行静态代码分析
本文将介绍如何使用SonarCloud进行.NET Core项目的静态代码分析.SonarCloud是SonarQube提供的基于云的版本,特别针对于开源项目是免费的. 首先,在sonarcloud. ...
- Windows抓屏技术
Windows桌面共享中一些常见的抓屏技术 1. BitBlt 我想做Windows开发应该都知道这个API, 它能实现DC间的内容拷贝, 如果我们把源DC指定成Monitor DC或是桌面DC, ...
- Ubuntu编译安装最新的webkit
好久都没更新webkit 源码在ubuntu上编译了,网上搜了一下,基本上都是早期编译的webkit版本.可能是大家都去搞高大上的谷歌浏览器了吧. 今天就以ubuntu14.04版本作为编译环境来讲讲 ...
- Angular2入门:TypeScript的函数 - 剩余参数和箭头函数
- set get del
//设置 $ob = new Redis(); $ob->connect('127.0.0.1', 6379); $re = $ob->set('str1', serialize(['a' ...
- 查找第K小的数 BFPRT算法
出处 http://blog.csdn.net/adong76/article/details/10071297 BFPRT算法是解决从n个数中选择第k大或第k小的数这个经典问题的著名算法,但很多人并 ...
- IdentityServer4 中文文档 -10- (快速入门)使用密码保护API
IdentityServer4 中文文档 -10- (快速入门)使用密码保护API 原文:http://docs.identityserver.io/en/release/quickstarts/2_ ...