因為現項目中有用到多線程和並發的知識,所以打算近期補習一下多線程相關的內容。第一篇文章從最基礎的開始,就是如何開啟一個線程,如何啟動線程和阻塞線程等,這篇文章分以下幾點進行總結。
首先通過一張圖來了解一下進程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,歡迎大家繼續關注。