计算机中经常会有多个任务同时运行,其中总有一些看起来更紧急,更需要优先完成。比如我们现在有两个任务,一个任务是下载一部电影,另一个任务是检测用户的输入。显然及时响应用户操作应具有更高的优先级,因为我们不能让用户等得太久。线程的优先级可以通过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#线程优先级详解的更多相关文章

  1. “全栈2019”Java多线程第十一章:线程优先级详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  2. “全栈2019”Java多线程第十章:Thread.State线程状态详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  3. Java线程池详解(二)

    一.前言 在总结了线程池的一些原理及实现细节之后,产出了一篇文章:Java线程池详解(一),后面的(一)是在本文出现之后加上的,而本文就成了(二).因为在写完第一篇关于java线程池的文章之后,越发觉 ...

  4. Java性能分析之线程栈详解与性能分析

    Java性能分析之线程栈详解 Java性能分析迈不过去的一个关键点是线程栈,新的性能班级也讲到了JVM这一块,所以本篇文章对线程栈进行基础知识普及以及如何对线程栈进行性能分析. 基本概念 线程堆栈也称 ...

  5. nginx源码分析线程池详解

    nginx源码分析线程池详解 一.前言     nginx是采用多进程模型,master和worker之间主要通过pipe管道的方式进行通信,多进程的优势就在于各个进程互不影响.但是经常会有人问道,n ...

  6. 三、VIP课程:并发编程专题->01-并发编程之Executor线程池详解

    01-并发编程之Executor线程池详解 线程:什么是线程&多线程 线程:线程是进程的一个实体,是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系 ...

  7. Tomcat 连接数与线程池详解

    前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在前面的文章 详解Tomcat配置文件server.xm ...

  8. 【转载】Java 集合详解

    转载:https://www.cnblogs.com/ysocean/p/6555373.html 一.集合的由来 通常,我们的程序需要根据程序运行时才知道创建多少个对象.但若非程序运行,程序开发阶段 ...

  9. Java 并发编程 | 线程池详解

    原文: https://chenmingyu.top/concurrent-threadpool/ 线程池 线程池用来处理异步任务或者并发执行的任务 优点: 重复利用已创建的线程,减少创建和销毁线程造 ...

随机推荐

  1. GIT 图形化操作指南

    Git操作指南(2) -- Git Gui for Windows的建库.克隆(clone).上传(push).下载(pull).合并 关于linux上建库等操作请看文章: http://hi.bai ...

  2. MongoDB--副本集基本信息【面试必备】

    副本集的概念 副本集是一组服务器,其中有一个是主服务器(primary),用于处理客户端请求:还有多个备份服务器(secondary),用于保存主服务器的数据副本.如果主服务器崩溃了,备份服务器会自动 ...

  3. DOMContentLoaded时间触发与js,css,img的关联

    DOMContentLoaded触发原理: 1.规范总是那么的晦涩,但至少有一点是可以明确了的,就是在JS(不包括动态插入的JS)执行完之后,才会触发DOMContentLoaded事件. 2.DOM ...

  4. 初识Composer

    关于vendor name和project name的区别? 包名(package name)包含了供应商名(vendor name)和项目名(project name)是为了避免命名冲突的 requ ...

  5. Java8 使用 stream().map()提取List对象的某一列值及排重

    List对象类(StudentInfo) public class StudentInfo implements Comparable<StudentInfo> { //名称 privat ...

  6. 1、SpringMVC架构

    1.SpringMVC架构 1.1 Spring web mvc 介绍 spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中 ...

  7. git教程1-gitlab部署

    https://about.gitlab.com/install/#centos-7 https://mirror.tuna.tsinghua.edu.cn/help/gitlab-ce/ gitla ...

  8. CentOS7.3下Zabbix3.5之邮件报警配置

    一.邮件客户端以及脚本相关配置 1.安装sendmail,一般操作系统默认安装了安装 yum install sendmail 启动 service sendmail start 设置开机启动 chk ...

  9. ubuntu16.0.4下修改MySQL的data目录之mysqld启动报错

    由于需要更换MySQL的data目录,更改完成后启动报错如下: apparmor="DENIED" operation="mknod" profile=&quo ...

  10. CodeForces - 186A-Comparing Strings

    Some dwarves that are finishing the StUDY (State University for Dwarven Youngsters) Bachelor courses ...