執行緒比較重要,最近面試的話幾乎都會問到, 日常中也會用到(不知不覺),到底執行緒是個什麼鬼?結合最近看的幾本書,這裡做一個記錄
1.什麼是程式?執行緒?多執行緒?優點?缺點?
對於計算機而言,每雙擊一個應用程式,系統都會對此程式分配一個或者多個程式,這一點開啟工作管理員介面(登出)即可明白。如此,程式則可以理解為執行緒的容器,由系統建立,又在具體執行過程中建立了執行緒。而執行緒是程式中的獨立執行單元,對於系統而言,是通過排程執行緒來是應用程式工作。多執行緒可狹義的理解程式中包含有多個單執行緒的執行流。
優點: 由於存在優先順序、等待等機制,這使得多執行緒能提高CPU的利用率,當不需要某個執行緒時,可呼叫等待方法來達到目的
缺點: 執行緒需要佔用記憶體,執行緒越多佔用記憶體也越多;
多執行緒需要協調和管理,所以需要CPU時間跟蹤執行緒;
執行緒之間對共享資源的訪問會相互影響,必須解決競用共享資源的問題;
執行緒太多會導致控制成本增加,會增加不可控的的風險
2.使用C#建立一個執行緒
public static void WirteNumber() { for (int i = 0; i < 10; i++) { Console.WriteLine(i); } } public static void Maintest() { Thread t = new Thread(WirteNumber); t.Start(); //執行執行緒 }
初看,並不覺有什麼神奇之處,僅僅是多了一個Thread 物件,利用反射可以查到,Thread的建構函式有兩類,一類帶引數,一類不帶引數
如: 不帶引數(ThreadStart 委託) -- t.Start()
帶引數(ParameterizedThreadStart 委託) -- t.Start(Para)
而對於其他的簡單操作,這裡列表統計下
3.前臺執行緒和後臺執行緒
在一個程式中,當所有前臺執行緒停止執行後,CLR會強制結束所有仍在執行的後臺程執行緒,這些後臺執行緒會被直接終止,而不會丟擲異常,只有設定了IsBackground屬性為True,Thread類所建立的執行緒才為後臺執行緒,否則為前臺執行緒。
如果想讓後臺執行緒先執行完,那麼可以使用 join、sleep 方法來實現
4. 使用 C# 中的 lock 關鍵字
5. 使用 Monitor 類鎖定資源
鎖可以用來保護資源,常見的訂票系統,比如客戶每訂一張票,後臺系統的資料庫就減少一張,如果共有1000張,當A使用者下單的時刻,後臺票數(資源)是被鎖起來,即同一時刻只能有一個客戶來下單,這樣後臺出票的順序也是連續的,然後B客戶下單。若多客戶同時下單,後臺票號就不能連貫輸出。具體例子如下:
6. 處理異常
程式一單執行,就有可能出現異常,優秀的程式碼只是出現異常的可能性較小,如何正確的去捕捉、處理 異常,是程式中必須要考慮的問題。執行緒也不例外。
上面的內容來自《C#執行緒基礎》這本書,其實說的都是很簡單的基礎內容,看看就好
真正專案中,會有一些執行緒的綜合應用,包括執行緒池、非同步多執行緒等等。