一 概述

  • 在C#中线程的优先级使用线程的Priority属性设置即可,默认的优先级是Normal,在设置优先级后,优先级 高的线程将优先执行

  • 优先级的值通过ThreadPriority枚举类型来设置,从低到高分别为Lowest、BelowNormal、Normal、AboveNormal、Highest

<!--more-->

二 实例

2.1 实例一  通过设置线程的优先级来控制输出奇数和偶数的线程,为了看出设置线程优先级的效果将输出 1〜100 中的奇数和 0〜100 中的偶数 

2.1.1 代码

<span style="color:#333333">class Program
{static void Main(string[] args){ThreadStart ts1 = new ThreadStart(PrintEven);Thread t1 = new Thread(ts1);//设置打印偶数线程的优先级t1.Priority = ThreadPriority.Lowest;ThreadStart ts2 = new ThreadStart(PrintOdd);Thread t2 = new Thread(ts2);//设置打印奇数线程的优先级t2.Priority = ThreadPriority.Highest;t1.Start();t2.Start();}//打印1~100中的奇数public static void PrintOdd(){for(int i = 1; i <= 100; i = i + 2){Console.WriteLine(i);}}//打印0~100中的偶数public static void PrintEven(){for(int i = 0; i <= 100; i = i + 2){Console.WriteLine(i);}}
}</span>

2.1.2 效果图

2.1.3 说明

  • 从上面的运行效果可以看出,由于输出奇数的线程的优先级高于输出偶数的线程,所以在输出结果中优先输出期数的次数会更多

  • 此外,每次输出的结果也不是固定的。通过优先级是不能控制线程中的先后执行顺序的,只能是优先级高的线程执行的次数多而已

  • 线程状态控制的方法包括暂停线程(Sleep)、中断线程(Interrupt)、挂起线程(Suspend)、唤醒形成(Resume)、终止线程(Abort)

2.2 实例二  使用暂停线程 (Sleep) 的方法让打印奇数和打印偶数的线程交替执行,即打印 0〜10 的数 

2.2.1 代码

<span style="color:#333333">class Program
{static void Main(string[] args){ThreadStart ts1 = new ThreadStart(PrintOdd);Thread t1 = new Thread(ts1);ThreadStart ts2 = new ThreadStart(PrintEven);Thread t2 = new Thread(ts2);t1.Start();t2.Start();}//打印1~100中的奇数public static void PrintOdd(){for(int i = 1; i <= 10; i = i + 2){//让线程休眠 1 秒Thread.Sleep(1000);Console.WriteLine(i);}}//打印0~100中的偶数public static void PrintEven(){for(int i = 0; i <= 10; i = i + 2){Console.WriteLine(i);//让线程休眠 1 秒Thread.Sleep(1000);}}
}</span>

2.2.2 效果

2.2.3 说明

  • 从上面的运行效果可以看出,通过Sleep方法能控制两个线程执行的先后顺序

  • 需要注意的是,两个线程虽然交替执行,但每次运行该程序的效果依然是不同的

2.3 实例三  模拟发放 10 个红包,当剩余 5 个红包时线程终止 

2.3.1 代码

<span style="color:#333333">class Program
{private static int count = 10;private static void GiveRedEnvelop(){while (count > 0){count--;if(count == 4){//终止当前线程Console.WriteLine("红包暂停发放!");Thread.CurrentThread.Abort();}Console.WriteLine("剩余 {0} 个红包", count);}}static void Main(string[] args){ThreadStart ts = new ThreadStart(GiveRedEnvelop);Thread t = new Thread(ts);t.Start();}
}</span>

2.3.2 效果

2.3.3 说明

  • 目前,由于挂起线程(Suspend)和唤醒线程(Resume)的操作很容易造成线程的死锁状态,已经被弃用了,而是使用标识符字段来设置线程挂起和唤醒的状态

  • 所谓线程死锁就是多个线程之间处于相互等待的状态

  • 线程分为前台线程和后台线程,前台线程不用等主程序结束,后台线程则需要应用程序运行结束后才能结束

  • 此外,在应用程序运行结束后,后台线程即使没有运行完也会结束,前台线程必须等待自身线程运行结束后才会结束

  • 使用Thread对象的IsBackground属性来判断线程是否为后台线程

2.4 实例四  在上一实例的基础上判断发红包的线程是否为后台线程,如果不是后台线程,将其设置为后台线程 

2.4.1 代码

<span style="color:#333333">class Program{private static int count = 10;private static void GiveRedEnvelop(){while (count > 0){count--;if (count == 4){//终止当前线程Console.WriteLine("红包暂停发放!");Thread.CurrentThread.Abort();}Console.WriteLine("剩余{0}个红包",count);}}static void Main(string[] args){ThreadStart ts = new ThreadStart(GiveRedEnvelop);Thread t = new Thread(ts);t.Start();if (t.IsBackground == false){Console.WriteLine("该线程不是后台线程!");t.IsBackground = true;}else{Console.WriteLine("该线程是后台线程!");}}}</span>

2.4.2 说明

运行该程序,直接输出“该线程不是后台线程!”,由于将该线程设置为后台线程,则不会输出红包发放的信息

C#开发之——Priority(14.5)相关推荐

  1. 循序渐进学.Net Core Web Api开发系列【14】:异常处理

    循序渐进学.Net Core Web Api开发系列[14]:异常处理 参考文章: (1)循序渐进学.Net Core Web Api开发系列[14]:异常处理 (2)https://www.cnbl ...

  2. 三维数字沙盘电子沙盘人工智能地理信息系统开发教程第14课

    三维数字沙盘电子沙盘人工智能地理信息系统开发教程第14课 很久没有写了,主要前段时间在针对怎么显示高精度的 倾斜数据而努力,现在终于实现了效果不错.以前的版本显示倾斜数据控制不太好.最近SDK也改动了 ...

  3. 用Tkinter打造GUI开发工具(14)Tkinter小部件的Label标签部件

    用Tkinter打造GUI开发工具(14)Tkinter小部件的Label标签部件 标签Label部件是Tkinter最常用的部件之一,其语法格式如下. label=tk.Label ( master ...

  4. C#开发BIMFACE系列14 服务端API之批量获取转换状态详情

    系列目录     [已更新最新开发文章,点击查看详细] 上一篇<C#开发BIMFACE系列13 服务端API之获取转换状态>中介绍了根据文件ID查询单个文件的转换状态. 本文介绍批量获取转 ...

  5. 微信公众帐号开发教程第14篇-自定义菜单的创建及菜单事件响应

    微信5.0发布 2013年8月5日,伴随着微信5.0 iPhone版的发布,公众平台也进行了重要的更新,主要包括: 1)运营主体为组织,可选择成为服务号或者订阅号: 2)服务号可以申请自定义菜单: 3 ...

  6. c51中断优先级c语言,基于proteus的51单片机开发实例(14)中断嵌套和中断优先级...

    1. 基于proteus的51单片机开发实例(14)中断嵌套和中断优先级 1.1. 实验目的 在前面实例中我们已经学习了51单片机的定时器/计数器中断,外部中断,通过这些实例,知道了中断电路的设计,中 ...

  7. 使用Python Django开发web应用14 静态文件

    版本声明:转载请注明出处.未经允许,禁止商业用途. 14 使用Python Django开发web应用 静态文件 讲师:刘一凡 第一步: 准备静态文件,制作图片OurBlog 第二步: 缺省配置下.静 ...

  8. MOSS 2010:Visual Studio 2010开发体验(14)——列表开发之事件接收器

    通过前面几篇,我们已经完成了内容类型,列表定义,列表实例的开发.本篇继续讲解列表中的一个重要环节--事件接收器开发. 我们的场景是:我希望之前做好的订单列表这个内容类型自动地具有某些事件特征,例如当用 ...

  9. 【STM32 .Net MF开发板学习-14】红外遥控器编码识别

    一年前我写过一篇博文<自制电脑红外遥控接收器(PC软解码)>,文中介绍借助几个简单的器件通过PC串口,来获取红外遥控器的按键信息.现在我们已经学会了如何用PWM技术驱动智能小车(参见< ...

最新文章

  1. 个推CTO安森:我所理解的数据中台
  2. c语言输出最后不带空格,新人提问:如何将输出时每行最后一个空格删除
  3. 页面判断用户是否登录
  4. Pig安装与配置教程
  5. android l 电池,DIY新技能--M1L换电池
  6. 【转载】Nessus安全测试插件编写教程
  7. 实验四报告 20135209潘恒 20135204郝智宇
  8. 圣思园java se培训总结(58-)(java1.5新特性,可变参数,包装类)
  9. mysql 所有外键_mysql中的外键
  10. 17.TCP/IP 详解卷1 --- TCP: 传输控制协议
  11. 20210706_IEEEDataPort免费订阅
  12. NOIP2019数字游戏
  13. DruidDataSource
  14. selenium登录豆瓣网
  15. java配置ehcache_配置和使用Ehcache
  16. 【maven】maven是什么?maven安装及idea中使用maven
  17. 计算机专业职业规划模版
  18. 基于ssm应届毕业生在线职位管理平台
  19. Henry捡钱 Java 动态规划
  20. i7 11700k和12700k哪个好

热门文章

  1. FFmpeg[4] - 将视频文件转码成FLV格式(FFmpeg转封装1)
  2. React中使用echarts绘制图表
  3. 使用Kotlin在Android Studio中创建井字游戏
  4. 网络营销之百度问答平台(1)
  5. Knowledge Distillation 知识蒸馏详解
  6. 让我欢喜!!!华硕RT-N11+无线路由!!!
  7. Linux CPU 100%问题 | 理解 CPU负载和 CPU使用率
  8. 自动驾驶惯性传感器中的基本原理笔记
  9. Spring Boot 接入支付宝完整流程实战,网友:看完后秒懂,原来是我想复杂了!...
  10. 计算机学的语数英大概是那些,小学语数英点读电脑版