對於全部須要等待的操做,例如移動文件,數據庫和網絡訪問都須要必定的時間,此時就能夠啓動一個新的線程,同時完成其餘任務。一個進程的多個線程能夠同時運行在不一樣的CPU上或多核CPU的不一樣內核上。數據庫
線程是程序中獨立的指令流。在VS編輯器中輸入代碼的時候,系統會分析代碼,用下劃線標註遺漏的分號和其餘語法錯誤,這就是用一個後臺線程完成。Word文檔須要一個線程等待用戶輸入,另外一個線程進行後臺搜索,第三個線程將寫入的數據存儲在臨時文件中。運行在服務器上的應用程序中等待客戶請求的線程成爲偵聽器線程。服務器
進程包含資源,如Window句柄,文件系統句柄或其餘內核對象。每一個進程都分配的虛擬內存。一個進程至少包含一個線程。網絡
一個應用程序啓動,通常會啓動一個進程,而後進程啓動多個線程。多線程
1,計算機的核心是CPU,它承擔了全部的計算任務。它就像一座工廠,時刻在運行。編輯器
2,若是工廠的電力有限一次只能供給一個車間使用。也就是說一個車間開工的時候,其餘車間就必須停工。背後的含義就是。單個CPU一次只能運行一個任務。(多核CPU能夠運行多個任務) 操作系統
3,進程就比如工廠的車間,它表明CPU所能處理的單個任務。任一時刻,CPU老是運行一個進程,其餘進程處於非運行狀態。線程
4,一個車間裏,能夠有不少工人,他們協同完成一個任務。設計
5,線程就比如車間裏的工人。一個進程能夠包括多個線程。orm
6,車間的控件是工人們共享的,好比許多房間是每一個工人均可以進出的。這象徵一個進程的內存空間是共享的,每一個線程均可以使用這些共享空間。對象
7,進程就比如工廠的車間,它表明CPU所能處理的單個任務。任一時刻,CPU老是運行一個進程,其餘進程處於非運行狀態。
8,一個防止他人進入的簡單方法,就是門口加一把鎖(廁所)。先到的人鎖上門,後到的人看到上鎖,就在門口排隊,等鎖打開再進去。這就叫"互斥鎖"(Mutual exclusion,縮寫 Mutex),防止多個線程同時讀寫某一塊內存區域。
9,還有些房間,能夠同時容納n我的,好比廚房。也就是說,若是人數大於n,多出來的人只能在外面等着。這比如某些內存區域,只能供給固定數目的線程使用。
10,這時的解決方法,就是在門口掛n把鑰匙。進去的人就取一把鑰匙,出來時再把鑰匙掛回原處。後到的人發現鑰匙架空了,就知道必須在門口排隊等着了。這種作法叫作"信號量"(Semaphore),用來保證多個線程不會互相沖突。 不難看出,mutex是semaphore的一種特殊狀況(n=1時)。也就是說,徹底能夠用後者替代前者。可是,由於mutex較爲簡單,且效率高,因此在必須保證資源獨佔的狀況下,仍是採用這種設計。
11,操做系統的設計,所以能夠歸結爲三點:
(1)以多進程形式,容許多個任務同時運行;
(2)以多線程形式,容許單個任務分紅不一樣的部分運行;
(3)提供協調機制,一方面防止進程之間和線程之間產生衝突,另外一方面容許進程之間和線程之間共享資源。
只有一個前臺線程在運行,應用程序的進程就在運行,若是多個前臺線程在運行,可是Main方法結束了,應用程序的進程仍然是運行的,直到全部的前臺線程完成其任務爲止。
在默認狀況下,用Thread類建立的線程是前臺線程。線程池中的線程老是後臺線程。
在用Thread類建立線程的時候,能夠設置IsBackground屬性,表示它是一個前臺線程仍是一個後臺線程。
後臺線程用的地方:若是關閉Word應用程序,拼寫檢查器繼續運行就沒有意義了,在關閉應用程序的時候,拼寫檢查線程就能夠關閉。
當全部的前臺線程運行完畢,若是還有後臺線程運行的話,全部的後臺線程會被終止掉。
線程有操做系統調度,一個CPU同一時間只能作一件事情(運行一個線程中的計算任務),當有不少線程須要CPU去執行的時候,線程調度器會根據線程的優先級去判斷先去執行哪個線程,若是優先級相同的話,就使用一個循環調度規則,逐個執行每一個線程。
在Thead類中,能夠設置Priority屬性,以影響線程的基本優先級 ,Priority屬性是一個ThreadPriority枚舉定義的一個值。定義的級別有Highest ,AboveNormal,BelowNormal 和 Lowest。
1,獲取線程的狀態(Running仍是Unstarted,,,),當咱們經過調用Thread對象的Start方法,能夠建立線程,可是調用了Start方法以後,新線程不是立刻進入Running狀態,而是出於Unstarted狀態,只有當操做系統的線程調度器選擇了要運行的線程,這個線程的狀態纔會修改成Running狀態。咱們使用Thread.Sleep()方法可讓當前線程休眠進入WaitSleepJoin狀態。
2,使用Thread對象的Abort()方法能夠中止線程。調用這個方法,會在終止要終止的線程中拋出一個ThreadAbortException類型的異常,咱們能夠try catch這個異常,而後在線程結束前作一些清理的工做。
3,若是須要等待線程的結束,能夠調用Thread對象的Join方法,表示把Thread加入進來,中止當前線程,並把它設置爲WaitSleepJoin狀態,直到加入的線程完成爲止。