執行緒按照結束方式來說,分為前台執行緒和後台執行緒
乙個應用程式執行,會啟動乙個程序,這個程序擁有多個執行緒,其中可能有前台執行緒,也有後台執行緒。只有所有的前台執行緒都結束了,系統才會解除安裝應用程式域,也就是說,停止該程序,**該程序占用的記憶體等資源。後台執行緒必須依附於某個前台執行緒,不能單獨存在。
當所有的前台執行緒都退出後,系統會強制結束所有的後台執行緒,並解除安裝應用程式域。
舉個例子來說,有乙個winform程式,第一種情況,a為ui執行緒,是前台執行緒,b也為前台執行緒,向某乙個文字寫入資訊。注意,b執行緒是不像ui執行緒那樣能夠直觀的讓人看見,有點類似於qq等後台執行的意思,但是這依然是乙個前台執行緒。這是由執行緒的isbackgournd屬性決定的。b執行緒自開啟始執行後,就不會再受到父執行緒的任何影響,兩者是乙個完全平行的關係。當我們關閉ui後,前台執行緒結束了,雖然現在看不到任何介面,但是子執行緒b執行緒依然在執行。所以,系統也就沒有結束這些執行緒所在的程序。第二種情況,a為ui執行緒,是前台執行緒,b為向文字寫入內容的執行緒,但這次設定為了後台執行緒。當我們把ui執行緒關閉後,所有的前台執行緒都消失了,此時,b執行緒的父執行緒結束了,b執行緒也會被系統強制結束。我們發現,向文字寫入內容的後台執行緒已經自動被強制結束了。
主線程與子執行緒,是執行緒出現方式上的概念
乙個執行緒產生了另乙個執行緒,前者就是主線程,後者就是子執行緒。執行緒一旦產生,那麼就與主線程是平等的地位,沒有主次的關係。在winform程式中,第乙個執行緒是ui執行緒,其他執行緒都是由這個執行緒產生的,所以ui執行緒是主線程。但是從這個執行緒衍生出來的任何執行緒,無論是前台執行緒,還是後台執行緒,相互之間,以及與ui執行緒,都是地位平等的關係。如果產生的子執行緒是前台執行緒,那麼主線程與子執行緒就是在生命週期方面是平行的關係,相互之間是平等的。如果產生的子執行緒是後台執行緒,那麼,這個執行緒與前台執行緒唯一的區別就是,
不會阻止程序的結束,當所有前台執行緒結束後,這個執行緒會被強制結束。
這樣設計的原因:因為後台執行緒一般做的都是需要花費大量時間的工作,如果不這樣設計,主線程已經結束,而後台工作執行緒還在繼續,後台執行緒即時執行完成也已經沒有什麼實際的意義。比如說,有乙個winform程式,ui用來顯示計算結果,子執行緒b用來進行大量的十分耗時耗資源的計算。當使用者開啟程式後,由於某種原因,ui執行緒死掉並且退出了,如果此時子執行緒不是後台執行緒被強制結束的話,剩下的耗時耗資源的運算是沒有意義的,因為即使有了結果,也無法再ui上來顯示,因為ui已經退出了。另外的例子,word的ui執行緒為前台執行緒,拼寫檢查為後台執行緒。如果關閉word應用程式,拼寫檢查器繼續執行器程序就沒有意義了。在應用程式結束時,拼寫檢查器就可以關閉了。
主線程與子執行緒,前台執行緒與後台執行緒,是從執行緒的生成順序和執行緒是否阻止程序退出這兩個不同的方面進行區分的,是不同方面的概念。
前台執行緒和後台執行緒
net的公用語言執行時 common language runtime,clr 能區分兩種不同型別的執行緒 前台執行緒和後台執行緒。這兩者的區別就是 應用程式必須執行完所有的前台執行緒才可以退出 而對於後台執行緒,應用程式則可以不考慮其是否已經執行完畢而直接退出,所有的後台執行緒在應用程式退出時都會...
c 前台執行緒和後台執行緒
前台執行緒 在主線程執行結束後,若前台執行緒沒有執行完則會阻止主線程的關閉 後台執行緒 在主線程執行結束後,整個執行緒會結束 class threadsample public void countnumbers prints thread.currentthread.name,i static v...
(二)前台執行緒和後台執行緒
1.獲取執行緒狀態 2.終止執行緒 執行緒池執行的都是後台執行緒 執行緒池只能用於時間比較短的任務 static void main string args static void main string args 任務的層次結構 父任務等待子任務執行完成才完成 模擬線程爭用 using syste...