線程比較重要,最近面試的話幾乎都會問到, 日常中也會用到(不知不覺),到底線程是個什么鬼?結合最近看的幾本書,這里做一個記錄
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. 處理異常
程序一單運行,就有可能出現異常,優秀的代碼只是出現異常的可能性較小,如何正確的去捕捉、處理 異常,是程序中必須要考慮的問題。線程也不例外。
今天先寫到這里,明天繼續
文章列表