1.進程(Process)是Windows系統中的一個基本概念,它包含着一個運行程序所需要的資源。一個正在運行的應用程序在操作系統中被視為一個進程,進程可以包括一個或多個線程。線程是操作系統分配處理器時間的基本單元,在進程中可以有多個線程同時執行代碼。進程之間是相對獨立的,一個進程無法訪問另一個進程的數據(除非利用分布式計算方式),一個進程運行的失敗也不會影響其他進程的運行,Windows系統就是利用進程把工作划分為多個獨立的區域的。進程可以理解為一個程序的基本邊界。是應用程序的一個運行例程,是應用程序的一次動態執行過程。
2.線程:在任務管理器里面查詢當前總共運行的線程數,線程(Thread)是進程中的基本執行單元,是操作系統分配CPU時間的基本單位,一個進程可以包含若干個線程,在進程入口執行的第一個線程被視為這個進程的主線程。在.NET應用程序中,都是以Main()方法作為入口的,當調用此方法時系統就會自動創建一個主線程。線程主要是由CPU寄存器、調用棧和線程本地存儲器(Thread Local Storage,TLS)組成的。CPU寄存器主要記錄當前所執行線程的狀態,調用棧主要用於維護線程所調用到的內存與數據,TLS主要用於存放線程的狀態信息。
3.多線程的優點:可以同時完成多個任務;可以使程序的響應速度更快;可以讓占用大量處理時間的任務或當前沒有進行處理的任務定期將處理時間讓給別的任務;可以隨時停止任務;可以設置每個任務的優先級以優化程序性能。
4.多線程的不利:
(1)線程也是程序,所以線程需要占用內存,線程越多,占用內存也越多。
(2)多線程需要協調和管理,所以需要占用CPU時間以便跟蹤線程。
(3)線程之間對共享資源的訪問會相互影響,必須解決爭用共享資源的問題。
(4)線程太多會導致控制太復雜,最終可能造成很多程序缺陷。
5.一個進程可以創建一個或多個線程以執行與該進程關聯的部分程序代碼。
6.在C#中,線程是使用Thread類處理的,該類在System.Threading命名空間中。
7.創建多線程的步驟:
(1)編寫線程所要執行的方法
(2)實例化Thread類,並傳入一個指向線程所要執行方法的委托。(這時線程已經產生,但還沒有運行)
(3)調用Thread實例的Start方法,標記該線程可以被CPU執行了,但具體執行時間由CPU決定
8.線程的標識符:ManagedThreadId是確認線程的唯一標識符,程序在大部分情況下都是通過Thread.ManagedThreadId來辨別線程的。而Name是一個可變值,在默認時候,Name為一個空值 Null,開發人員可以通過程序設置線程的名稱,但這只是一個輔助功能。
9.線程的優先級別:當線程之間爭奪CPU時間時,CPU按照線程的優先級給予服務。高優先級的線程可以完全阻止低優先級的線程執行。.NET為線程設置了Priority屬性來定義線程執行的優先級別,里面包含5個選項,其中Normal是默認值。除非系統有特殊要求,否則不應該隨便設置線程的優先級別。
10.線程的狀態:通過ThreadState可以檢測線程是處於Unstarted、Sleeping、Running 等等狀態,它比 IsAlive 屬性能提供更多的特定信息。前面說過,一個應用程序域中可能包括多個上下文,而通過CurrentContext可以獲取線程當前的上下文。CurrentThread是最常用的一個屬性,它是用於獲取當前運行的線程。
11.Thread 中包括了多個方法來控制線程的創建、掛起、停止、銷毀,以后來的例子中會經常使用。
12.前台線程:只有所有的前台線程都結束,應用程序才能結束。默認情況下創建的線程都是前台線程
后台線程:只要所有的前台線程結束,后台線程自動結束。通過Thread.IsBackground設置后台線程。必須在調用Start方法之前設置線程的類型,否則一旦線程運行,將無法改變其類型。
13.線程同步:所謂同步:是指在某一時刻只有一個線程可以訪問變量。
如果不能確保對變量的訪問是同步的,就會產生錯誤。
14.
同步和異步是對方法執行順序的描述。
同步:等待上一行完成計算之后,才會進入下一行。
例如:請同事吃飯,同事說很忙,然后就等着同事忙完,然后一起去吃飯。
異步:不會等待方法的完成,會直接進入下一行,是非阻塞的。
15.線程的常用屬性
CurrentContext |
獲取線程正在其中執行的當前上下文。 |
CurrentThread |
獲取當前正在運行的線程。 |
ExecutionContext |
獲取一個 ExecutionContext 對象,該對象包含有關當前線程的各種上下文的信息。 |
IsAlive |
獲取一個值,該值指示當前線程的執行狀態。 |
IsBackground |
獲取或設置一個值,該值指示某個線程是否為后台線程。 |
IsThreadPoolThread |
獲取一個值,該值指示線程是否屬於托管線程池。 |
ManagedThreadId |
獲取當前托管線程的唯一標識符。 |
Name |
獲取或設置線程的名稱。 |
Priority |
獲取或設置一個值,該值指示線程的調度優先級。 |
ThreadState |
獲取一個值,該值包含當前線程的狀態。 |
16.線程的方法:
Abort() |
終止本線程。 |
GetDomain() |
返回當前線程正在其中運行的當前域。 |
GetDomainId() |
返回當前線程正在其中運行的當前域Id。 |
Interrupt() |
中斷處於 WaitSleepJoin 線程狀態的線程。 |
Join() |
已重載。 阻塞調用線程,直到某個線程終止時為止。 |
Resume() |
繼續運行已掛起的線程。 |
Start() |
執行本線程。 |
Suspend() |
掛起當前線程,如果當前線程已屬於掛起狀態則此不起作用 |
Sleep() |
把正在運行的線程掛起一段時間。 |