執行緒在C#中有5個優先順序:Highest、AboveNormal、Normal、BelowNormal和Lowest。講到執行緒的優先順序,就 會涉及執行緒的排程。Windows系統是一個基於優先順序的搶佔式排程系統。在系統中,如果有一個執行緒的優先順序較高,並且它正好處在就緒狀態,系統總是會優 先執行該執行緒。換句話說,高優先順序的執行緒總是在系統排程演算法中獲取更多的CPU執行時間。
我們可以在一個單CPU系統中測試下面的程式碼:
- static void Main(string[] args)
- {
- long t1Num = 0;
- long t2Num = 0;
- CancellationTokenSource cts = new CancellationTokenSource();
- Thread t1 = new Thread(() =>
- {
- while (true && !cts.Token.IsCancellationRequested)
- {
- t1Num++;
- }
- });
- t1.IsBackground = true;
- t1.Priority = ThreadPriority.Highest;
- t1.Start();
- Thread t2 = new Thread(() =>
- {
- while (true && !cts.Token.IsCancellationRequested)
- {
- t2Num++;
- }
- });
- t2.IsBackground = true;
- t2.Start();
- Console.ReadLine();
- //停止執行緒
- cts.Cancel();
- Console.WriteLine("t1Num:" + t1Num.ToString());
- Console.WriteLine("t2Num:" + t2Num.ToString());
- }
結果我們會發現,如果這段程式執行在單核計算機中,優先順序為Highest的執行緒t1,其輸出值幾乎總是會大於優先順序為Normal(預設)的執行緒t2。
在C#中,使用Thread和ThreadPool新起的執行緒,預設優先順序都是Normal。雖然可以像上面的示例那樣去修改執行緒的優先順序,但是一 般不建議這樣做。當然,如果是一些非常關鍵的執行緒,我們還是可以提升執行緒的優先順序的。這些關鍵執行緒應當具有執行時間短、能即刻進入等待狀態等特徵。