首页 > 编程笔记 > C#笔记 阅读:17

什么是线程的优先级,C# Priority设置线程优先级(附带实例)

线程优先级是指一个线程相对于另一个线程的优先级,每个线程都有一个分配的优先级。

在公共语言运行库内创建的线程最初被分配为 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

相关文章