什么是线程的优先级,C# Priority设置线程优先级(附带实例)
线程优先级是指一个线程相对于另一个线程的优先级,每个线程都有一个分配的优先级。
在公共语言运行库内创建的线程最初被分配为 Normal 优先级,而在公共语言运行库外创建的线程,在进入公共语言运行库时将保留其先前的优先级。
线程是根据其优先级来调度执行的,用于确定线程执行顺序的调度算法随操作系统的不同而不同。在某些操作系统下,具有最高优先级(相对于可执行线程而言)的线程经过调度后总是最先运行的。如果具有相同优先级的多个线程都可用,则程序将遍历处于该优先级的线程,并为每个线程提供一个固定的时间片来执行。
只要具有较高优先级的线程可以运行,具有较低优先级的线程就不会执行。如果在给定的优先级上不再有可运行的线程,则程序将移到下一个较低的优先级,并在该优先级上调度线程以执行。如果具有较高优先级的线程可以运行,则具有较低优先级的线程将被抢先,并允许具有较高优先级的线程再次执行。
除此之外,当应用程序的用户界面在前台和后台之间移动时,操作系统还可以动态调整线程的优先级。
例如,在多任务操作系统中,每个线程都会得到一小段 CPU 时间片进行执行,在时间片结束时,将轮换另一个线程进入执行状态,这时系统会选择与当前线程优先级相同的线程进行执行。系统始终选择就绪状态下优先级较高的线程进入执行状态。
下图表明了处于各个优先级状态下的线程的运行顺序。

图 1 处于各个优先级状态下的线程的运行顺序
在图 1 中,优先级为 5 的线程 A 首先得到 CPU 时间片,当该时间片结束后,轮换到与线程 A 相同优先级的线程 B,当线程 B 的运行时间结束后,会继续轮换到线程 A,直到线程 A 与线程 B 都执行完毕,才会轮到线程 C,当线程 C 结束后,才会轮到线程 D。
多线程的执行本身就是多个线程的交换执行,并非同时执行,设置线程优先级的高低,只是为了说明该线程会优先执行或者暂不执行的概率更大一些而已,并不能保证优先级高的线程就一定会比优先级低的线程先执行。
线程的优先级值及说明如下表所示:
开发人员可以通过访问线程的 Priority 属性来获取和设置其优先级。Priority 属性用来获取或设置一个值,该值指示线程的调度优先级,其语法如下:
例如,将 th1 线程的优先级设置为最低,将 th2 线程的优先级设置为最高,然后再次运行,观察效果是否有变化,主要代码如下:
在公共语言运行库内创建的线程最初被分配为 Normal 优先级,而在公共语言运行库外创建的线程,在进入公共语言运行库时将保留其先前的优先级。
线程是根据其优先级来调度执行的,用于确定线程执行顺序的调度算法随操作系统的不同而不同。在某些操作系统下,具有最高优先级(相对于可执行线程而言)的线程经过调度后总是最先运行的。如果具有相同优先级的多个线程都可用,则程序将遍历处于该优先级的线程,并为每个线程提供一个固定的时间片来执行。
只要具有较高优先级的线程可以运行,具有较低优先级的线程就不会执行。如果在给定的优先级上不再有可运行的线程,则程序将移到下一个较低的优先级,并在该优先级上调度线程以执行。如果具有较高优先级的线程可以运行,则具有较低优先级的线程将被抢先,并允许具有较高优先级的线程再次执行。
除此之外,当应用程序的用户界面在前台和后台之间移动时,操作系统还可以动态调整线程的优先级。
例如,在多任务操作系统中,每个线程都会得到一小段 CPU 时间片进行执行,在时间片结束时,将轮换另一个线程进入执行状态,这时系统会选择与当前线程优先级相同的线程进行执行。系统始终选择就绪状态下优先级较高的线程进入执行状态。
下图表明了处于各个优先级状态下的线程的运行顺序。

图 1 处于各个优先级状态下的线程的运行顺序
在图 1 中,优先级为 5 的线程 A 首先得到 CPU 时间片,当该时间片结束后,轮换到与线程 A 相同优先级的线程 B,当线程 B 的运行时间结束后,会继续轮换到线程 A,直到线程 A 与线程 B 都执行完毕,才会轮到线程 C,当线程 C 结束后,才会轮到线程 D。
多线程的执行本身就是多个线程的交换执行,并非同时执行,设置线程优先级的高低,只是为了说明该线程会优先执行或者暂不执行的概率更大一些而已,并不能保证优先级高的线程就一定会比优先级低的线程先执行。
线程的优先级值及说明如下表所示:
优先级值 | 说明 |
---|---|
AboveNormal | 可以将 Thread 安排在具有 Highest 优先级的线程之后,在具有 Normal 优先级的线程之前 |
BelowNormal | 可以将 Thread 安排在具有 Normal 优先级的线程之后,在具有 Lowest 优先级的线程之前 |
Highest | 可以将 Thread 安排在具有任何其他优先级的线程之前 |
Lowest | 可以将 Thread 安排在具有任何其他优先级的线程之后 |
Normal | 可以将 Thread 安排在具有 AboveNormal 优先级的线程之后,在具有 BelowNormal 优先级的线程之前。默认情况下,线程具有 Normal 优先级 |
开发人员可以通过访问线程的 Priority 属性来获取和设置其优先级。Priority 属性用来获取或设置一个值,该值指示线程的调度优先级,其语法如下:
public ThreadPriority Priority { get; set; }其中,属性值为 ThreadPriority 枚举值之一,默认值为 Normal。
例如,将 th1 线程的优先级设置为最低,将 th2 线程的优先级设置为最高,然后再次运行,观察效果是否有变化,主要代码如下:
th1 = new Thread(new ThreadStart(Pro1)); //创建线程1对象 th1.Priority = ThreadPriority.Lowest; //设置优先级最低 th1.Start(); //启动线程1 th2 = new Thread(new ThreadStart(Pro2)); //创建线程2对象 th2.Priority = ThreadPriority.Highest; //设置优先级最高 th2.Start(); //启动线程2