線程是進程中的最小執行單元,多線程是指在給定時間內擁有多個線程的能力,并且可以調度它們從而在某一時刻處理多個操作,微軟的 .Net Framework
提供了 Thread 來幫助我們完成多線程開發。
Thread 編程 要想使用 Thread,需要在程序中引用 System.Threading
命名空間,然后再提供一個供線程調度的方法,這個方法是通過 Thread 中的 ThreadStart 委托代理的,下面的代碼展示了如何創建線程。
Thread t = new Thread(new ThreadStart(MyThreadMethod));
線程創建好之后,還需要調用 Start 方法去啟動,下面的代碼展示了如何去實現,哦,對了,上面的 MyThreadMethod
方法會在新的線程上被調度,而不是調用線程。
class Program { static void Main ( string [] args ) { Thread t = new Thread(new ThreadStart(MyThreadMethod)); t.Start(); Console.Read(); } static void MyThreadMethod ( ) { Console.WriteLine("Hello World!" ); } }
展示線程狀態 一個創建好的線程,它的生命周期內會有多個狀態,比如:Aborted, Background, Running, Stopped, Suspended, Unstarted 等等,這些狀態在 Thread 中是用 ThreadState
枚舉表示的,如下代碼所示:
[ Flags ] public enum ThreadState { Running = 0 , StopRequested = 1 , SuspendRequested = 2 , Background = 4 , Unstarted = 8 , Stopped = 16 , WaitSleepJoin = 32 , Suspended = 64 , AbortRequested = 128 , Aborted = 256 }
當一個 Thread 對象創建好之后,它的狀態就是 Unstarted
,然而當 Start 方法啟動之后,線程的狀態將會從 Unstarted
切換到 Running
狀態,下面的代碼展示了這種輪轉。
static void Main ( string [] args ) { Thread t = new Thread(new ThreadStart(MyThreadMethod)); Console.WriteLine("The thread''s state is:" + t.ThreadState.ToString()); t.Start(); Console.WriteLine("The thread''s state is:" + t.ThreadState.ToString()); }
控制線程的 前臺和后臺 一個線程要么是前臺線程要么是后臺線程,如果你是通過顯式的方式創建線程,它便是前臺線程,前后線程最大的區別在于:應用程序退出的前提必須是程序內的所有前臺線程都得到退出,相反,應用程序的退出不依賴于后臺線程。
你可以通過 IsBackground 屬性來設置 Thread 的前臺或者后臺,下面的代碼展示了如何去實現。
static void Main ( string [] args ) { Thread t = new Thread(new ThreadStart(MyThreadMethod)); t.Start(); t.IsBackground = true ; Console.WriteLine(“The thread’s background status is : “+t.IsBackground.ToString()); Console.Read(); }
除了啟動線程,還可以通過 Suspend() 和 Resume() 方法來 掛起
和 恢復
線程, 值得注意的是,你只能 恢復 你之前通過 Suspend 方法 掛起的線程,如下代碼所示:
static void Main ( string [] args ) { Thread t = new Thread(new ThreadStart(MyThreadMethod)); t.Start(); t.Suspend();
值得注意的是,現在的 Thread.Suspend()
和 Thread.Resume()
方法都是被標記成棄用的狀態了,取而代之的做法是:使用 AutoResetEvent
和 EventWaitHandle
方法來實現多線程之間的同步。
設置線程優先級 可以給一個線程賦予優先級,從而和內存中的其他線程爭搶 CPU 時間,在 C# 中是使用 ThreadPriority 枚舉來表示,大體上有如下值:Lowest, BelowNormal, Normal, AboveNormal 和 Highest,下面的代碼展示了如何給這兩個線程賦予優先級。
class Program { static void Main ( string [] args ) { Thread thread1 = new Thread(new ThreadStart(Method1)); Thread thread2 = new Thread(new ThreadStart(Method2)); thread1.Priority = ThreadPriority.Highest; thread2.Priority = ThreadPriority.Lowest; thread2.Start(); thread1.Start(); Console.Read(); } static void Method1 ( ) { for (int i = 0 ; i < 10 ; i++) { Console.WriteLine("First thread: " + i); } } static void Method2 ( ) { for (int i = 0 ; i < 10 ; i++) { Console.WriteLine("Second thread: " + i); } } }
從上面的輸出結果中可以看出,Thread1 先于 Thread2 執行完,即使 Thread2.Start 是先啟動的,是不是很好的演示了優先級的概念。
線程是昂貴的,因為線程的整個生命周期需要消耗太多的資源,比如:初始化,上下文切換,釋放使用的資源 等等,所以在用 多線程
之前需要想好是否真的要這么做,當用多線程的時候,適當的使用 線程池 (ThreadPool)
是一個非常好的做法,畢竟線程池內部會幫你自動創建,釋放,調度線程,你只需要傻傻的用即可,同時也是提升程序響應的利器。
譯文鏈接:https://www.infoworld.com/article/3035134/how-to-work-with-threads-in-c.html
該文章在 2021/1/29 9:37:40 編輯過