繼續上一節的問題:調換兩個新建立的線程啟動順序會是什麼結果?
using System;
using System.Threading;
namespace Test
{
class TestThread
{
private static void FirstThreadFun()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine(Thread.CurrentThread.Name + " i = " + i);
}
Console.WriteLine(Thread.CurrentThread.Name + "的優先順序:" + Thread.CurrentThread.Priority);
Console.WriteLine(Thread.CurrentThread.Name + " 執行完畢");
}
private static void SecondThreadFun()
{
for (int j = 0; j < 10; j++)
{
Console.WriteLine(Thread.CurrentThread.Name + " j = " + j);
}
Console.WriteLine(Thread.CurrentThread.Name + "的優先順序:" + Thread.CurrentThread.Priority);
Console.WriteLine(Thread.CurrentThread.Name + " 執行完畢");
}
static void Main(string[] args)
{
//程式調用了Main()函數時,就起動了一個進程,同時也啟動了一個線程[這個線程就是主線程].
Thread.CurrentThread.Name = "MainThread";
Thread secondThread = new Thread(new ThreadStart(TestThread.SecondThreadFun));
//取名為 secondThread
secondThread.Name = "secondThread";
//設定線程的優先順序為AboveNormal[在所有建立的新線程中,執行順序為第二]
secondThread.Priority = ThreadPriority.AboveNormal;
//建立第一個線程
Thread firstThread = new Thread(new ThreadStart(TestThread.FirstThreadFun));
//取名為 firstThread
firstThread.Name = "firstThread";
//設定線程的優先順序為最進階[在所有建立的新線程中,最先執行.線程優先順序預設為Normal,共5 級:Highest,AboveNormal,Normal,BelowNormal,Lowest]
firstThread.Priority = ThreadPriority.Highest;
for (int z = 0; z < 20; z++)
{
if (z == 10)
{
//這裡與上一節的代碼略有不同
secondThread.Start();
firstThread.Start();
firstThread.Join();
secondThread.Join();
}
else
{
Console.WriteLine(Thread.CurrentThread.Name + " z = " + z);
}
}
Console.Read();
}
}
}
運行結果:
圖1 圖2 圖3
總結:
1.上面三個圖的運行結果都不一樣,但有一點是相同的.主線程是最先執行的[不管新建立的線程層級如何]
2.當滿足新線程啟動條件後,secondThread總是先執行,是因為secondThread線程先啟動了[儘管firstThread優先順序高於secondThread] .
3.當secondThread運行了一小段時間後,firstThread線程接著執行.
4.當兩個新建立的線程都執行完畢後,主線程繼續執行.
注:
1.多線程同時工作的時候,優先順序高的線程要先啟動[Thread.Start()],先加入[Thread.Join()].
2.這個例子裡因為啟動順序搞錯了,也可以看出多線程,並不是說所有的線程同時工作,而是輪流程執行的.
Thread.ThreadState 屬性
這個屬性代表了線程運行時狀態,在不同的情況下有不同的值,我們有時候可以通過對該值的判斷來設計程式流程。
ThreadState 屬性的取值如下:
Aborted:線程已停止;
AbortRequested:線程的Thread.Abort()方法已被調用,但是線程還未停止;
Background:線程在後台執行,與屬性Thread.IsBackground有關;
Running:線程正在正常運行;
Stopped:線程已經被停止;
StopRequested:線程正在被要求停止;
Suspended:線程已經被掛起(此狀態下,可以通過調用Resume()方法重新運行);
SuspendRequested:線程正在要求被掛起,但是未來得及響應;
Unstarted:未調用Thread.Start()開始線程的運行;
WaitSleepJoin:線程因為調用了Wait(),Sleep()或Join()等方法處於封鎖狀態;
上面提到了Background狀態表示該線程在後台運 行,那麼後台啟動並執行線程有什麼特別的地方呢?其實後台線程跟前台線程只有一個區別,那就是後台線程不妨礙程式的終止。一旦一個進程所有的前台線程都終止 後,CLR(通用語言運行環境)將通過調用任意一個存活中的後台進程的Abort()方法來徹底終止進程。