1.C#對線程進行操作時,通過Thread類,可以對線程進行創建、掛起、恢復、休眠、終止及設置優先級。
Thread類位於System.Threading命名空間下,該命名空間還包含一個ThreadPool類(允許用戶使用系統提供的線程池)和一個Timer類(在線程池上執行回調方法)
在線程運行期間,不同的時刻會表現為不同的狀態,但它總是處於由ThreadState定義的一個或多個狀態中。用戶可以通過使用ThreadPriority枚舉為線程定義優先級,但不能保證操系統會接收該優先級
2.Thread類常用的屬性:
CurrentThread 獲取當前正在運行的線程
IsAlive 獲取一個值,該值只是當前線程的執行狀態
Name 獲取或設置線程的名稱
Priority 獲取或設置一個值,該值只是線程的調度優先級
ThreadState 獲取一個值,該值包含當前線程的狀態
3.Thread類常用的方法:
Abort 調用此方法通常會終止線程
Join 阻止調用線程,直到某個線程終止時為止
Resume 繼續已掛起的線程
Sleep 將當前線程阻止指定的毫秒數
Start 使線程被安排進行執行
Suspend 掛起線程,或者如果線程已掛起,則不起作用
4.創建線程--Start()方法
創建一個線程,只需將其聲明並為其提供線程起始點處的方法委托。
Thread類具有接受一個ThreadState委托或ParameterizedThreadStart委托的構造函數,該委托包裝了調用Start方法時由新線程調用的方法。
只有在調用Start方法后才會創建實際的線程。Start方法的 兩種重載方式 :
(1)導致操作系統將當前實例的狀態更改為ThreadState.Running
語法: public void Start()
說明:該方法無參數,無返回值
(2)使操作系統當前實例的狀態更改為 ThreadState.Running,並選擇線程執行所需要的方法
語法: public void Start(Object parameter)
說明:參數parameter表示一個對象,包含線程執行的方法要使用的數據
注意:如果線程已經終止,就無法通過再次調用Start方法來重新啟動
5.線程的掛起與恢復--Suspend方法和Resume方法
(1)Suspend方法
該方法用來掛起線程,如果線程已經掛起則不起作用
語法:public void Suspend()
說明:調用Suspend方法掛起線程時,.net允許要掛起的線程再執行幾個指令,目的是為了到達.net認為線程可以安全掛起的狀態
(2)Resume方法
該方法用來繼續已掛起的線程
語法:public void Resume()
說明:通過Resume方法來恢復被暫停的線程是,無論調用了多少次Suspend方法,調用Resume方法均會使另外的線程脫離掛起狀態,並導致當前線程繼續執行
6.線程休眠--Sleep()方法
該方法用來將當前線程阻止指定的時間,有 兩種重載方式
(1)將當前線程掛起指定的時間
語法: public static void Sleep(int millisecondsTimeout)
說明:參數 millisecondsTimeout表示線程被阻止的毫秒數,指定零以指示應掛起此線程以使其他等待線程能夠執行;指定Infinite以無限期阻止線程
(2)將當前線程阻止指定的時間
語法: public static void Sleep(TimeSpan timeout)
說明:參數timeout表示線程被阻止的時間量的TimeSpan,指定零以指示應掛起此線程以使其他等待線程能夠執行;指定Infinite以無限期阻止線程
7.終止線程
終止線程可以分別使用Abort方法和Join方法實現
(1)Abort方法
用來終止線程,有 兩種重載形式 ,都是引發的ThreadAbortExecption
public void Abort()--終止進程
public void Abort(Object stateInfo)--終止線程並提供有關線程終止的異常信息
參數stateInfo是一個對象,包含應用程序特定的信息(如狀態),該信息可供正被終止的線程使用
(2)Join方法
Join用來阻止調用線程,直到某個線程終止時為止。有 三種重載形式
public void Join()
public bool Join(int millisecondsTimeout)
說明:參數 millisecondsTimeout表示等待線程終止的毫秒數。如果線程已終止,則返回值為true,如果線程經過了 millisecondsTimeout指定時間后未終止,返回值為false
public bollJoin(TimeSpan timeout)
說明:參數 timeout表示等待線程終止的時間量TimeSpan。如果線程已終止,則返回值為true,如果線程經過 timeout時間量之后未終止,則返回值為false
8.線程的優先級
AboveNormal 可以將Thread安排在具有highest優先級線程之后,在Normal之前
BelowNormal 在Normal之后,Lowest之前
Highest 在具有任何其他優先級的線程之前
Lowest 在具有其他任何優先級的線程之后
Normal 在AboveNormal之后,BelowNormal之前。默認值。
可以通過調用線程的Priority屬性來獲取和設置其優先級。Priority屬性用來獲取或設置一個值,該值指示線程的調度優先級。
語法:public ThreadPriority Priority{get;set;}
說明:屬性值是ThreadPriority枚舉值之一,默認值為Normal。
實例代碼:
static void Main(string[] args)
{
Thread thread1 = new Thread(new ThreadStart(Thread1)); //使用自定義方法Thread1聲明線程
thread1.Priority = ThreadPriority.Lowest; //設置線程的調度優先級
Thread thread2 = new Thread(new ThreadStart(Thread2)); //使用自定義方法Thread2聲明線程
thread1.Start(); //開啟線程一
thread2.Start(); //開啟線程二
Console.ReadLine();
} static void Thread1()
{
Console.WriteLine("線程一");
} static void Thread2()
{
Console.WriteLine("線程二");
}
運行截圖:
注意:這里很多人都疑惑了,既然thread1優先級比thread2優先級低,為什么還是先輸出的thread1的內容呢?
其實那是因為你不了解線程的優先級實現原理
線程的優先級並不是你想象的先執行哪個后執行哪個
而是所有的線程不論優先級高低都會執行,
優先級越高表示CPU分配給該線程的時間片越多,執行時間就多
優先級越低表示CPU分配給該線程的時間片越少,執行時間就少