C Thread 執行緒狀態知識

2022-03-25 12:28:33 字數 2880 閱讀 8530

.net 基礎類庫的system.threading命名空間提供了大量的類和介面支援多執行緒。這個命名空間有很多的類。system.threading.thread類是建立並控制線程,設定其優先順序並獲取其狀態最為常用的類。他有很多的方法,在這裡我們將就比較常用和重要的方法做一下介紹:

thread.start():啟動執行緒的執行;

thread.suspend():掛起執行緒,或者如果執行緒已掛起,則不起作用;

thread.resume():繼續已掛起的執行緒;

thread.interrupt():中止處於wait或者sleep或者join 執行緒狀態的執行緒;

thread.join():阻塞呼叫執行緒,直到某個執行緒終止時為止

thread.sleep():將當前執行緒阻塞指定的毫秒數;

thread.abort():以開始終止此執行緒的過程。如果執行緒已經在終止,則不能通過thread.start()來啟動執行緒。

通過呼叫thread.sleep,thread.suspend或者thread.join可以暫停/阻塞執行緒。呼叫sleep()和suspend()方法意味著執行緒將不再得到cpu時間。這兩種暫停執行緒的方法是有區別的,sleep()使得執行緒立即停止執行,但是在呼叫suspend()方法之前,公共語言執行時必須到達乙個安全點。乙個執行緒不能對另外乙個執行緒呼叫sleep()方法,但是可以呼叫suspend()方法使得另外乙個執行緒暫停執行。對已經掛起的執行緒呼叫thread.resume()方法會使其繼續執行。不管使用多少次suspend()方法來阻塞乙個執行緒,只需一次呼叫resume()方法就可以使得執行緒繼續執行。已經終止的和還沒有開始執行的執行緒都不能使用掛起。thread.sleep(int x)使執行緒阻塞x毫秒。只有當該執行緒是被其他的執行緒通過呼叫thread.interrupt()或者thread.abort()方法,才能被喚醒。如果對處於阻塞狀態的執行緒呼叫thread.interrupt()方法將使執行緒狀態改變,但是會丟擲threadinterupptedexception異常,你可以捕獲這個異常並且做出處理,也可以忽略這個異常而讓執行時終止執行緒。在一定的等待時間之內,thread.interrupt()和thread.abort()都可以立即喚醒乙個執行緒。

我們可以通過使用thread.abort()方法來永久銷毀乙個執行緒,而且將丟擲threadabortexception異常。使終結的執行緒可以捕獲到異常但是很難控制恢復,僅有的辦法是呼叫thread.resetabort()來取消剛才的呼叫,而且只有當這個異常是由於被呼叫執行緒引起的異常。對於a和b兩個執行緒,a執行緒可以正確的使用thread.abort()方法作用於b執行緒,但是b執行緒卻不能呼叫thread.resetabort()來取消thread.abort()操作。

thread.abort()方法使得系統悄悄的銷毀了執行緒而且不通知使用者。一旦實施thread.abort()操作,該執行緒不能被重新啟動。呼叫了這個方法並不是意味著執行緒立即銷毀,因此為了確定執行緒是否被銷毀,我們可以呼叫thread.join()來確定其銷毀,thread.join()是乙個阻塞呼叫,直到執行緒的確是終止了才返回。但是有可能乙個執行緒呼叫thread.interrupt()方法來中止另外乙個執行緒,而這個執行緒正在等待thread.join()呼叫的返回。

盡可能的不要用suspend()方法來掛起阻塞執行緒,因為這樣很容易造成死鎖。假設你掛起了乙個執行緒,而這個執行緒的資源是其他執行緒所需要的,會發生什麼後果。因此,我們盡可能的給重要性不同的執行緒以不同的優先順序,用thread.priority()方法來代替使用thread.suspend()方法。

thread類有很多的屬性,這些重要的屬性是我們多執行緒程式設計必須得掌握的。

thread.isalive屬性:獲取乙個值,該值指示當前執行緒的執行狀態。如果此執行緒已啟動並且尚未正常終止或中止,則為true;否則為false。

thread.name 屬性:獲取或設定執行緒的名稱。

thread.priority 屬性:獲取或設定乙個值,該值指示執行緒的排程優先順序。

thread.threadstate 屬性:獲取乙個值,該值包含當前執行緒的狀態。

thread狀態

system.threading.thread.threadstate屬性定義了執行時執行緒的狀態。執行緒從建立到執行緒終止,它一定處於其中某乙個狀態。當執行緒被建立時,它處在unstarted狀態,thread類的start() 方法將使執行緒狀態變為running狀態,執行緒將一直處於這樣的狀態,除非我們呼叫了相應的方法使其掛起、阻塞、銷毀或者自然終止。如果執行緒被掛起,它將處於suspended狀態,除非我們呼叫resume()方法使其重新執行,這時候執行緒將重新變為running狀態。一旦執行緒被銷毀或者終止,執行緒處於stopped狀態。處於這個狀態的執行緒將不復存在,正如執行緒開始啟動,執行緒將不可能回到unstarted狀態。執行緒還有乙個background狀態,它表明執行緒執行在前台還是後台。在乙個確定的時間,執行緒可能處於多個狀態。據例子來說,乙個執行緒被呼叫了sleep而處於阻塞,而接著另外乙個執行緒呼叫abort方法於這個阻塞的執行緒,這時候執行緒將同時處於waitsleepjoin和abortrequested狀態。一旦執行緒響應轉為sle阻塞或者中止,當銷毀時會丟擲threadabortexception異常。

執行緒優先順序

system.threading.thread.priority列舉了執行緒的優先級別,從而決定了執行緒能夠得到多少cpu時間。高優先順序的執行緒通常會比一般優先順序的執行緒得到更多的cpu時間,如果不止乙個高優先順序的執行緒,作業系統將在這些執行緒之間迴圈分配cpu時間。低優先順序的執行緒得到的cpu時間相對較少,當這裡沒有高優先順序的執行緒,作業系統將挑選下乙個低優先順序 的執行緒執行。一旦低優先順序的執行緒在執行時遇到了高優先順序的執行緒,它將讓出cpu給高優先順序的執行緒。新建立的執行緒優先順序為一般優先順序,我們可以設定執行緒的優先順序別的值,如下面所示:

highest 

abovenormal 

normal 

belownormal 

C Thread 執行緒狀態知識

net 基礎類庫的system.threading命名空間提供了大量的類和介面支援多執行緒。這個命名空間有很多的類。system.threading.thread類是建立並控制線程,設定其優先順序並獲取其狀態最為常用的類。他有很多的方法,在這裡我們將就比較常用和重要的方法做一下介紹 thread.s...

c Thread 執行緒狀態知識

thread函式 函式名執行進入的狀態及其他說明 thread.start 啟動執行緒的執行 thread.suspend 掛起執行緒,或者如果執行緒已掛起,則不起作用 thread.resume 繼續已掛起的執行緒 thread.interrupt 中止處於 wait或者sleep或者join 執...

C thread 執行緒封裝類

思路是這樣的,寫乙個thread抽象類,有函式virtual void run 0,類中呼叫window api函式createthread 建立並啟動執行緒,所有執行緒都執行同乙個靜態函式threadfunction lpvoid param param傳遞執行緒物件的this指標 createt...