因為現項目中有用到多線程和並發的知識,所以打算近期補習一下多線程相關的內容。第一篇文章從最基礎的開始,就是如何開啟一個線程,如何啟動線程和阻塞線程等,這篇文章分以下幾點進行總結。
首先通過一張圖來了解一下進程Process,應用程序域AppDomain和線程Thread之間的關系。
從圖中可以總結出以下幾點:
總結起來主要有以下幾個場景:
.net framework為我們提供了Thread類來使用多線程,它在命名空間System.Threading下。
開啟線程:創建一個Thread對象,它分為無參類ThreadStart,有參類ParameterizedThreadStart,傳入參數為Object類型。
前台線程和後台線程:使用Thread.Start()方法啟動的線程默認為前台線程,一般我們將新啟動的線程設置為後台線程,因為這樣我們的主線程就不需要等待前台線程執行完成。
掛起線程:使用Thread.Sleep()方法可將主線程掛起,但是系統無法預計異步線程(新開啟的線程)的運行時間,所以使用Sleep()方法來阻塞主線程並不科學。通常我們使用異步線程的Join()方法來保證主線程在異步線程運行結束後才結束。
終止線程:使用Thread.Abort()方法。
下面使用一個簡單的示例來演示如何使用簡單的多線程,示例代碼如下。
namespace ThreadDemo { class Program { static void Main(string[] args) { // Thread Fish fish = new Fish() { Name="小黃魚" }; Thread thread1 = new Thread(() => { fish.Move(); }); thread1.IsBackground = true; thread1.Start(); Fish fish2 = new Fish { Name = "大鲨魚" }; Thread thread2 = new Thread(() => { fish2.Move(); }); thread2.IsBackground = true; thread2.Start(); Console.ReadKey(); } } /// <summary> /// 魚 /// </summary> public class Fish { public string Name { get; set; } public int Score { get; set; } public Fish() { } public void Move() { Console.WriteLine(string.Format("{0}在游來游去...", Name)); } } }
程序運行的結果為:
下一篇文章我將總結如何使用線程池ThreadPool,歡迎大家繼續關注。