C# Thread類 線程優先級


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分配給該線程的時間片越少,執行時間就少 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM