在这里我们要注意的是其它线程都是依附于Main()函数所在的线程的,Main()函数是C#程序的入口,起始线程可以称之为主线程,如果所有的前台线程都停止了,那么主线程可以终止,而所有的后台线程都将无条件终止。而所有的线程虽然在微观上是串行执行的,但是在宏观上你完全可以认为它们在并行执行。

  读者一定注意到了Thread.ThreadState这个属性,这个属性代表了线程运行时状态,在不同的情况下有不同的值,于是我们有时候可以通过对该值的判断来设计程序流程。ThreadState在各种情况下的可能取值如下:

  • Aborted:线程已停止
  • AbortRequested:线程的Thread.Abort()方法已被调用,但是线程还未停止
  • Background:线程在后台执行,与属性Thread.IsBackground有关
  • Running:线程正在正常运行
  • Stopped:线程已经被停止
  • StopRequested:线程正在被要求停止
  • Suspended:线程已经被挂起(此状态下,可以通过调用Resume()方法重新运行)
  • SuspendRequested:线程正在要求被挂起,但是未来得及响应
  • Unstarted:未调用Thread.Start()开始线程的运行
  • WaitSleepJoin:线程因为调用了Wait(),Sleep()或Join()等方法处于封锁状态

  上面提到了Background状态表示该线程在后台运行,那么后台运行的线程有什么特别的地方呢?其实后台线程跟前台线程只有一个区别,那就是后台线程不妨碍程序的终止。一旦一个进程所有的前台线程都终止后,CLR(通用语言运行环境)将通过调用任意一个存活中的后台进程的Abort()方法来彻底终止进程。

  当线程之间争夺CPU时间时,CPU按照是线程的优先级给予服务的。在C#应用程序中,用户可以设定5个不同的优先级,由高到低分别是Highest,AboveNormal,Normal,BelowNormal,Lowest,在创建线程时如果不指定优先级,那么系统默认为ThreadPriority.Normal。给一个线程指定优先级
,我们可以使用如下代码:

  //设定优先级为最低
  myThread.Priority=ThreadPriority.Lowest;

  通过设定线程的优先级,我们可以安排一些相对重要的线程优先执行,例如对用户的响应等等。

  现在我们对怎样创建和控制一个线程已经有了一个初步的了解,下面我们将深入研究线程实现中比较典型的的问题,并且探讨其解决方法。

  三. 线程的同步和通讯——生产者和消费者

  假设这样一种情况,两个线程同时维护一个队列,如果一个线程对队列中添加元素,而另外一个线程从队列中取用元素,那么我们称添加元素的线程为生产者,称取用元素的线程为消费者。生产者与消费者问题看起来很简单,但是却是多线程应用中一个必须解决的问题,它涉及到线程之间的同步和通讯问题。

  前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数。但是多线程环境下,可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生。C#提供了一个关键字lock,它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待。在C#中,关键字lock定义如下:

  lock(expression) statement_block

C#的多线程机制探索3相关推荐

  1. C#的多线程机制探索1

    注:本文中出现的代码均在.net Framework RC3环境中运行通过 一.多线程的概念 Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器 ...

  2. C#的多线程机制探索4

    expression代表你希望跟踪的对象,通常是对象引用.一般地,如果你想保护一个类的实例,你可以使用this:如果你希望保护一个静态变量(如互斥代码段在一个静态方法内部),一般使用类名就可以了.而s ...

  3. [ZT]C#的多线程机制探索(2)

    三.线程的同步和通讯--生产者和消费者 假设这样一种情况,两个线程同时维护一个队列,如果一个线程对队列中添加元素,而另外一个线程从队列中取用元素,那么我们称添加元素的线程为生产者,称取用元素的线程 ...

  4. C#的多线程机制探索7

    大家可以看到,在上面的例程中,同步是通过等待Monitor.Pulse()来完成的.首先生产者生产了一个值,而同一时刻消费者处于等待状态,直到收到生产者的"脉冲(Pulse)"通知 ...

  5. C#的多线程机制探索6

    <!-- Please check block file --> 然后在下面这个类MonitorSample的Main()函数中我们要做的就是创建两个线程分别作为生产者和消费者,使用Cel ...

  6. C#的多线程机制探索5

    首先,我们定义一个被操作的对象的类Cell,在这个类里,有两个方法:ReadFromCell()和WriteToCell.消费者线程将调用ReadFromCell()读取cellContents的内容 ...

  7. C#的多线程机制探索2

    下面我们就动手来创建一个线程,使用Thread类创建线程时,只需提供线程入口即可.线程入口使程序知道该让这个线程干什么事,在C#中,线程入口是通过ThreadStart代理(delegate)来提供的 ...

  8. C#的多线程(2)——机制探索

    注:本文中出现的代码均在.net Framework RC3环境中运行通过 一.多线程的概念 Windows是一个多任务的系统,如果你使用的是windows 2000及 其以上版本,你可以通过任务管理 ...

  9. Java实用教程笔记 Java多线程机制

    Java多线程机制 泛型要考,后来又说不考了 多线程不考 12.1 进程与线程Process and Thread 12.2Java中的线程Threads in Java 线程的状态与生命周期The ...

最新文章

  1. 获取预测模型在测试集中预测错误的数据样本
  2. Android中的Android中的Surface和SurfaceView
  3. 计算机二级能学到知识吗,2017年关于计算机二级msoffice学习知识点
  4. 《漫画算法2》源码整理-4 字符串匹配算法 RK KMP
  5. oracle 临时表存在哪里_openGauss魔改PG?它能兼容Oracle的数据库表吗?
  6. Vue.js 打造酷炫的可视化数据大屏
  7. tableau 自定义省份_在Tableau中使用自定义图像映射
  8. [Leedcode][JAVA][第999题][直接考虑题意]
  9. 内存屏障,先看这篇文章
  10. 学会了CopyOnWriteArrayList可以再多和面试官对线三分钟
  11. php解析二级json,PHP Json 解析
  12. 快速突破面试算法之树结构篇
  13. 学校计算机房使用登记制度,瑶风中学计算机房管理制度
  14. vue2+element使用插件导出全部表格数据
  15. 【微信小程序】微信小程序函数封装
  16. 连接Janusgraph时报Unable to determine Elasticsearch server version. Default to FIVE.异常
  17. 计算机应用编程师职业指导,计算机应用个人职业生涯规划书.doc
  18. HSV色彩空间和颜色分量范围
  19. 科学绘图经典--Grapher
  20. AppsFlyer SDK 接入

热门文章

  1. 信息学奥赛一本通 1087:级数求和 | 1918:【02NOIP普及组】级数求和 | OpenJudge NOI 1.5 27
  2. 动态规划 —— 背包问题 P09 —— 背包问题的变化
  3. 计算多项式的值(信息学奥赛一本通-T1093)
  4. NOIP2018最终成绩(一等奖名单)
  5. Github简单使用
  6. android h5 ftp,HBuilderX ftp插件使用教程
  7. OpenCV辅助对象(help objects)(1)_TermCriteria
  8. 抓住那只喵(HTML5-神经猫)
  9. ubuntu18.04安装pytorch1.6
  10. 微信支付开发(全网资源) - 统计篇