国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

c#.net多線程編程教學(2):Thread類

2024-07-10 13:07:22
字體:
來源:轉載
供稿:網友

這章將向大家介紹.net中的線程api,怎么樣用c#創建線程,啟動和停止線程,設置優先級和狀態.

  在.net中編寫的程序將被自動的分配一個線程.讓我們來看看用c#編程語言創建線程并且繼續學習線程的知識。我們都知道.net的運行時環境的主線程由main ()方法來啟動應用程序,而且.net的編譯語言有自動的垃圾收集功能,這個垃圾收集發生在另外一個線程里面,所有的這些都是后臺發生的,讓我們無法感覺到發生了什么事情.在這里默認的是只有一個線程來完成所有的程序任務,但是正如我們在第一篇文章討論過的一樣,有可能我們根據需要自己添加更多的線程讓程序更好的協調工作。比如說我們的例子中,一個有用戶輸入的同時需要繪制圖形或者完成大量的運算的程序,我們必須得增加一個線程,讓用戶的輸入能夠得到及時的響應,因為輸入對時間和響應的要求是緊迫的,而另外一個線程負責圖形繪制或者大量的運算。

  .net 基礎類庫的system.threading命名空間提供了大量的類和接口支持多線程。這個命名空間有很多的類,我們將在這里著重討論thread這個類。

  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線程可以正確的使用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類,在類得構造函數中調用threadstart委派。這個委派包含了線程從哪里開始執行。當線程啟動后,start()方法啟動一個新的線程。下面是例子程序。

 

using system;
using system.threading ;
namespace learnthreads
{
class thread_app
{
public static void first_thread()
{
 console.writeline("first thread created");
 thread current_thread = thread.currentthread;
 string thread_details = "thread name: " + current_thread.name + "/r/nthread state: " + current_thread.threadstate.tostring()+"/r/n thread priority level:"+current_thread.priority.tostring();
 console.writeline("the details of the thread are :"+ thread_details);
 console.writeline ("first thread terminated");
}

public static void main()
{
 threadstart thr_start_func = new threadstart (first_thread);
 console.writeline ("creating the first thread ");
 thread fthread = new thread (thr_start_func);
 fthread.name = "first_thread";
 fthread.start (); //starting the thread
}
}
}


  在這個例子中,創建了一個fthread的線程對象,這個線程負責執行first_thread()方法里面的任務。當thread的start() 方法被調用時包含first_thread()的地址threadstart的代理將被執行。

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
  lowest


結論:在這一部分,我們討論了線程的創建何線程的優先級。system.threading命名空間還包含了線程鎖定、線程同步何通訊、多線程管理類以及死鎖解決等等高級特性,在后面的部分我們將繼續討論這些內容。

注冊會員,創建你的web開發資料庫,
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 凌云县| 绥阳县| 山西省| 那坡县| 南乐县| 孝感市| 永定县| 彰化市| 稻城县| 盐山县| 鄂尔多斯市| 务川| 都兰县| 大安市| 九江县| 日土县| 靖江市| 冷水江市| 治县。| 从江县| 麻江县| 阜宁县| 隆德县| 辽阳市| 达州市| 绵阳市| 临江市| 怀集县| 五寨县| 广昌县| 金堂县| 黑山县| 济源市| 奉新县| 修文县| 海安县| 拉萨市| 绥棱县| 盐津县| 突泉县| 长宁区|