本帖最后由 sxdxgzr@126.com 于 2013-8-3 20:22 编辑
1.NET线程优先级:是指定一个线程的相对于其他线程的相对优先级,它规定了线程的执行顺序,对于在CLR中创建的线程,其优先级别默认为Normal,而在CLR之外创建的线程进入CLR时,将会保留其先前的优先级,可以通过访问线程的Priority属性来获取或设置线程的优先级别。System.Threading命名空间中的ThreadPriority枚举定义了一组线程优先级的所有可能值,我这里按级别由高到低排列出来,具体的说明就不在这里解释。 Highest , AboveNormal , Normal , BelowNormal , Lowest。
2线程调度:无论线程是否运行于CLR中,线程执行时间片是有操作系统进行分配的,线程是严格按照其优先级来调度执行的,调度算法来确定线程的执行顺序,不同的操作系统可能又不同的调度算法。具有最高优先级别的线程经过调度后总是首先运行,只要具有较高优先级别的线程可以运行,较低级别的所有线程就必须等待。如果具有相同优先级的多个线程都可以运行,那么调度程序将遍历处于该优先级的所有线程,并为每个线程提供一个固定的执行时间片,因此同一优先级的线程很多时候都是交替执行的。如果具有较高优先级的线程可以运行,较低优先级的线程将被抢先,并允许具有较高优先级的线程再次执行,如果在给定的优先级上不再有可运行的线程,则调度程序将转移到下一个低级别的优先级,并在该优先级上调度线程。
3如:- using System;
- using System.Threading;
- namespace Thread2
- {
- class Test
- {
- public static void Main()
- {
- //线程threadA 优先级默认为nomal
- var threadA = new Thread(delegate()
- {
- for (int i = 0; i < 20; i++)
- {
- Console.Write("A");
- }
- });
- //线程B 优先级为Highest
- var threadB = new Thread(delegate()
- { //线程threadB
- for (int i = 0; i < 20; i++)
- {
- Console.Write("B");
- }
- }){Priority = ThreadPriority.Highest};
- //线程threadC 优先级为BelowNormal
- var threadC = new Thread(delegate()
- {
- for (int i = 0; i < 20; i++)
- {
- Console.Write("C");
- }
- }) {Priority = ThreadPriority.BelowNormal};
- //线程threadD 优先级为AboveNormal
- var threadD = new Thread(delegate()
- {
- for (int i = 0; i < 20; i++)
- {
- Console.Write("D");
- }
- }) {Priority = ThreadPriority.AboveNormal};
- //启动线程
- threadB.Start();
- threadD.Start();
- threadA.Start();
- threadC.Start();
- Console.ReadKey();
- }
- }
- }
复制代码 由于设置线程调度优先级threadB>threadD>threadA>threadC,且线程按优先级启动时的执行结果:线程优先级高的先执行完,优先级低的后执行完。可以运行代码试试。
4
|