(转载)C#线程优先级详解
计算机中经常会有多个任务同时运行,其中总有一些看起来更紧急,更需要优先完成。比如我们现在有两个任务,一个任务是下载一部电影,另一个任务是检测用户的输入。显然及时响应用户操作应具有更高的优先级,因为我们不能让用户等得太久。线程的优先级可以通过Thread类Priority属性设置,Priority属性是一个ThreadPriority型枚举,列举了5个优先等级:AboveNormal、BelowNormal、Highest、Lowest、Normal。普通线程的优先级默认为Normal;如果想有更高的优先级,可设置为AboveNormal或Highest;如果想有较低的优先级,可设置为BelowNormal或Lowest。
建立一个名为“ThreadPriorityTest”的控制台项目,在主函数里建立两个线程。首先我们让两个线程优先级相同,观察两个线程的执行顺序。
using System.Threading; static void Main( string [] args) { //线程A Thread ThreadA = new Thread( delegate () { for ( int i = 0; i <= 100000000; i++) { if (i % 1000000 == 0) { Console.Write( 'A' ); } } }); //线程B Thread ThreadB = new Thread( delegate () { for ( int i = 0; i <= 100000000; i++) { if (i % 1000000 == 0) { Console.Write( 'B' ); } } }); //启动线程 ThreadA.Start(); ThreadB.Start(); } |
两个线程优先级相同(均为默认值Normal),所以它们交替进行,从运行结果也可以看出,两个线程被执行的几率大致相等。
实际上,除了ThreadA和ThreadB外,程序中还有一个主线程(Main Thread)。现在我们在主线程中添加一些输出代码,看看主线程和工作线程A、B是如何并发运行的。
static void Main( string [] args) { //线程A Thread ThreadA = new Thread( delegate () { for ( int i = 0; i <= 100000000; i++) { if (i % 1000000 == 0) { Console.Write( 'A' ); } } }); //线程B Thread ThreadB = new Thread( delegate () { for ( int i = 0; i <= 100000000; i++) { if (i % 1000000 == 0) { Console.Write( 'B' ); } } }); //启动线程 ThreadA.Start(); ThreadB.Start(); //主线程执行代码 for ( int i = 0; i <= 100000000; i++) { if (i % 1000000 == 0) { Console.Write( 'M' ); } } } |
运行结果表明,默认情况下主线程和工作线程的优先级相同,也是交替进行,被执行的概率大体相同。
现在我们改变线程的优先级,看看结果如何。为了使结果更明显,我们把循环次数增加5倍。
static void Main( string [] args) { //线程A Thread ThreadA = new Thread( delegate () { for ( int i = 0; i <= 500000000; i++) { if (i % 1000000 == 0) { Console.Write( 'A' ); } } }); //线程B Thread ThreadB = new Thread( delegate () { for ( int i = 0; i <= 500000000; i++) { if (i % 1000000 == 0) { Console.Write( 'B' ); } } }); //改变线程优先级 ThreadA.Priority = ThreadPriority.AboveNormal; ThreadB.Priority = ThreadPriority.BelowNormal; //启动线程 ThreadA.Start(); ThreadB.Start(); //主线程执行代码 for ( int i = 0; i <= 500000000; i++) { if (i % 1000000 == 0) { Console.Write( 'M' ); } } } |
系统优先执行优先级较高的线程,但这只意味着优先级较高的线程占有更多的CPU时间,并不意味着一定要先执行完优先级较高的线程,才会执行优先级较低的线程。这一点从运行结果中也可以看出,线程B 偶尔会出现在主线程和线程A前面。
(转载)C#线程优先级详解的更多相关文章
- “全栈2019”Java多线程第十一章:线程优先级详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第十章:Thread.State线程状态详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Java线程池详解(二)
一.前言 在总结了线程池的一些原理及实现细节之后,产出了一篇文章:Java线程池详解(一),后面的(一)是在本文出现之后加上的,而本文就成了(二).因为在写完第一篇关于java线程池的文章之后,越发觉 ...
- Java性能分析之线程栈详解与性能分析
Java性能分析之线程栈详解 Java性能分析迈不过去的一个关键点是线程栈,新的性能班级也讲到了JVM这一块,所以本篇文章对线程栈进行基础知识普及以及如何对线程栈进行性能分析. 基本概念 线程堆栈也称 ...
- nginx源码分析线程池详解
nginx源码分析线程池详解 一.前言 nginx是采用多进程模型,master和worker之间主要通过pipe管道的方式进行通信,多进程的优势就在于各个进程互不影响.但是经常会有人问道,n ...
- 三、VIP课程:并发编程专题->01-并发编程之Executor线程池详解
01-并发编程之Executor线程池详解 线程:什么是线程&多线程 线程:线程是进程的一个实体,是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系 ...
- Tomcat 连接数与线程池详解
前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在前面的文章 详解Tomcat配置文件server.xm ...
- 【转载】Java 集合详解
转载:https://www.cnblogs.com/ysocean/p/6555373.html 一.集合的由来 通常,我们的程序需要根据程序运行时才知道创建多少个对象.但若非程序运行,程序开发阶段 ...
- Java 并发编程 | 线程池详解
原文: https://chenmingyu.top/concurrent-threadpool/ 线程池 线程池用来处理异步任务或者并发执行的任务 优点: 重复利用已创建的线程,减少创建和销毁线程造 ...
随机推荐
- The project was not built since its build path is incomplete. Cannot find the class file for java.lang.Object
The project was not built since its build path is incomplete. Cannot find the class file for java.la ...
- STL特性总述——写在前面
所谓的容器,见名知意,容纳其他数据的"器具": 特点 1)支持泛型: 2)保存副本:本质上传入对象的拷贝. 3)内存托管 :构建对象于堆,无需人工干预,自动管理内存的生存周期. S ...
- sourcetree 不停的让输入密码,报 password required
sourcetree 不停的让输入密码,报 password required sourcetree 不停的让输入密码,报 password required1.在终端(terminal)打开你的工程 ...
- 关于在SSM框架下使用PageHelper
首先,如果各位在这块配置和代码有什么问题欢迎说出来,我也会尽自己最大的能力帮大家解答 这些代码我都是写在一个小项目里的,项目的github地址为:https://github.com/Albert-B ...
- WebAPI学习及Swagger使用
本文用来保存自己学习WebAPI和Swagger使用过程中参考的文章,以及对WebAPI的初步了解. 1.RESTful风格 WebAPI只支持Http协议: 1.1.WebAPI与MVC的区别 Va ...
- 避免picture图片无法删除,提示正在被其他进程使用
pictureBox1.Image = Image.FromStream(ByteToStream(SetImageToByteArray(cutImgPath))); #region 将文件转换成流 ...
- sql 查找重复数据,并且重复数据有子集
SELECT A.* FROM comm_department A INNER JOIN ( select path,count(*) as count from comm_department gr ...
- 练习三十八:矩阵for循环应用
习题如下: 求一个3*3矩阵对角线元素之和 利用for循环控制输出二维数组,再将a[i][j]累加后输出 a = [] sum1 = 0.0 for i in range(3): a.append([ ...
- Jmeter4.0---- HTTP请求默认值(15)
1.说明 在线程组中,添加”HTTP请求默认值”,并填写 协议,服务器名称/IP ,端口号,编码等 ,之后该线程组中的所有请求,可以不用填写这几项,启动后会直接调用”HTTP请求默认值”中的数据,方便 ...
- 网络安全基础之arp
ARP(Address Resolution Protocol),中文解释为地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议. ARP大致工作流程如下: 主机发送信息时将包含目标IP地址 ...