《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. . ...
随机推荐
- 如何完美回答面试官问的Mybatis初始化原理!!!
前言 对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章将通过以下几点详细介绍MyBatis的初始化过程. MyBatis的初始化做了什么 MyBatis基于XML配置文件 ...
- Introduction to CELP Coding
Speex is based on CELP, which stands for Code Excited Linear Prediction. This section attempts to in ...
- 记hangfire后台任务运行一段时间后不运行了。
什么是Hangfire Hangfire 是一个开源的.NET任务调度框架,目前1.6+版本已支持.NET Core.个人认为它最大特点在于内置提供集成化的控制台,方便后台查看及监控. https:/ ...
- Excel透视技巧-三级分类统计名单、分类统计数据
Excel透视技巧-三级分类统计名单.分类统计数据 基础数据 透视表1--三级分类统计名单 透视表2-分类统计数据
- 分布式高性能消息系统(Kafka MQ)的原理与实践
一.关于Kafka的一些概念和理解 Kafka是一个分布式的数据流平台,它基于独特日志文件形式,提供了高性能消息系统功能.也可以用于大数据流管道. Kafka维护了按目录划分的消息订阅源,称之为 To ...
- Emgucv学习系列之环境搭建
Emgucv功能介绍 Emgucv是跨平台的,是Opencv的.net版本.可以对图片.视频等多媒体资源进行加工处理的SDK库. Emgucv下载和安装SDK 下载地址:https://sourcef ...
- Netty入门——客户端与服务端通信
Netty简介Netty是一个基于JAVA NIO 类库的异步通信框架,它的架构特点是:异步非阻塞.基于事件驱动.高性能.高可靠性和高可定制性.换句话说,Netty是一个NIO框架,使用它可以简单快速 ...
- lucene简单搜索demo
方法类 package com.wxf.Test; import com.wxf.pojo.Goods; import org.apache.lucene.analysis.standard.Stan ...
- javascript中的iterable
遍历Array可以采用下标循环,遍历Map和Set就无法使用下标.为了统一集合类型,ES6标准引入了新的iterable类型,Array.Map和Set都属于iterable类型. 具有iterabl ...
- VUE + ElementUI 从搭建到运行
版权声明:本文为博主原创文章,欢迎转载,转载请注明作者.原文超链接 前言:本文简洁的描述VUE + ElementUI 从搭建到运行,可以根据本文先搭建出可运行的项目,然后再详细回顾每个步骤所做的事: ...