一、什麼是線程?
線程(Thread)是代碼的執行序列或者執行路徑。線程與進程的概念有一些相似,它類似於一個輕量級的進程:一個操作系統中可以運行多個進程,一個進程內可以運行多個線程。每個應用程序至少運行在一個線程上。當只有一個線程時,稱作單線程應用程序,該線程由系統自動創建。例如下面的.Net Core 控制檯應用程序Main方法。
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
Console.WriteLine("我是單線程程序");
}
}
}
從線程的生命週期來看這個程序的執行過程如下:
每個線程都有一個入口點,上面的程序來說入口點即Main()方法,,執行Main()方法的線程通常被稱爲主線程(Main Thread),主線程的入口點也是應用程序的起始點。對於單線程程序來說,代碼的執行順序永遠是至上而下的。也就是說,控制檯中肯定是先輸出“Hello World”再輸出“我是一個單線程程序”。
二、多線程的好處
1、使用線程可以把佔據長時間的程序中的任務放到後臺去處理
2、用戶界面可以更加吸引人,這樣比如用戶點擊了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進度
3、程序的運行速度可能加快
4、在一些等待的任務實現上如用戶輸入、文件讀寫和網絡收發數據等,線程就比較有用了。在這種情況下可以釋放一些珍貴的資源如內存佔用等等
上面的程序只是輸出了兩行文字,所以不會感覺到運行時間上的差距。但是如果程序中某個任務需要很長時間完成,那麼後面的執行步驟也得等待這個任務執行完成才能繼續執行。舉個生活中的例子:我們需要做晚飯,分爲煮飯和炒菜兩個環節,其中煮飯需要30分鐘,而炒菜需要20分鐘。用單線程去做的話,必須煮完飯再炒菜,那麼就需要50分鐘。而用多線程的做法是,先下米煮飯,同時炒菜,那樣30分鐘飯菜都好了。
using System;
using System.Threading;
namespace StudyThread
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(DateTime.Now);//記錄開始時間
cookRice();
friedDsh();
Console.WriteLine(DateTime.Now);//記錄結束時間
}
/// <summary>
/// 煮飯
/// </summary>
public static void cookRice()
{
Console.WriteLine("**********開始煮飯啦**********");
Thread.Sleep(1000*30); //讓線程睡眠30秒模擬煮飯時間
Console.WriteLine("**********飯煮好啦**********");
}
/// <summary>
/// 炒菜
/// </summary>
public static void friedDsh()
{
Console.WriteLine("**********開始炒菜啦**********");
Thread.Sleep(1000 * 30); //讓線程睡眠20秒模擬炒菜時間
Console.WriteLine("**********菜炒好啦**********");
}
}
}
從運行輸出結果可以看出單線程執行,剛好用了一分鐘。
三、線程的基本操作
3.1創建新線程
using System.Threading;
System.Threading命名空間下的Thread類提供了線程的基本操作。通過創建一個
Thread對象,並執行它的Start()方法,可以新建並運行一個新的線程。
還是用上面的煮飯炒菜的例子,代碼修改如下:
using System;
using System.Threading;
namespace StudyThread
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(DateTime.Now);//記錄開始時間
ThreadStart ts = new ThreadStart(friedDsh);//新線程的入口
Thread worker = new Thread(ts);//創建線程對象
worker.Start();
cookRice();
//friedDsh();
Console.WriteLine(DateTime.Now);//記錄結束時間
}
/// <summary>
/// 煮飯
/// </summary>
public static void cookRice()
{
Console.WriteLine("**********開始煮飯啦**********");
Thread.Sleep(1000*30); //讓線程睡眠30秒模擬煮飯時間
Console.WriteLine("**********飯煮好啦**********");
}
/// <summary>
/// 炒菜
/// </summary>
public static void friedDsh()
{
Console.WriteLine("**********開始炒菜啦**********");
Thread.Sleep(1000 * 30); //讓線程睡眠20秒模擬炒菜時間
Console.WriteLine("**********菜炒好啦**********");
Console.WriteLine(DateTime.Now);//記錄結束時間
}
}
}
從運行輸出結果可以看出單線程執行,用時是31秒。煮飯和炒菜是同時進行的。