背景:
在.NET Framework1.0時代就誕生了Thread,也有大量相關的Api支持,thread創建是前台線程
缺陷:
1、一次使用一個線程來創建刪除線程,線程的創建和銷毀對系統開銷比較大
2、在高並發的場景,大量線程創建、銷毀會降低響應性能
一、構造方法
1.1帶參數的委托的構造方法——Thread(ParameterizedThreadStart)
ParameterizedThreadStart構造方法,定義:public delegate void ParameterizedThreadStart(object? obj)帶參數的Action委托
public static void Dosomething(object? word) { Console.WriteLine(word.ToString()); }
ParameterizedThreadStart ps = new ParameterizedThreadStart(Dosomething); Thread thread1 = new Thread(ps); thread1.Start("埃里克多");
1.2不帶參數的構造方法——Thread(ThreadStart)
ThreadStart構造方法,定義:public delegate void ThreadStart();
ThreadStart ts = new ThreadStart(Dothing); Thread thread2 = new Thread(ts); thread2.Start();
public static void Dothing() { Console.WriteLine("這是個無參數的方法。。。。"); }
二、相關屬性及方法
Thread.Start():啟動線程的執行;
Thread.Suspend():掛起線程,或者如果線程已掛起,則不起作用;
Thread.Resume():繼續已掛起的線程;
Thread.Interrupt():中止處於 Wait或者Sleep或者Join 線程狀態的線程;
Thread.Join():阻塞調用線程,直到某個線程終止時為止
Thread.Sleep():將當前線程阻塞指定的毫秒數,此時線程處於休眠狀態,期間此線程不再得到系統分配的執行時間片。
Thread.Abort():以開始終止此線程的過程。
2.1線程的執行是無序的
DisorderVerify(); //多次執行后會得到下面兩種結果 //結果一: //Thread_2 is start //Thread_1 is start //結果二: //Thread_1 is start //Thread_2 is start
static void DisorderVerify() { Thread thread1 = new Thread(() => Console.WriteLine("Thread_1 is start")); thread1.Name = "Thread_1"; Thread thread2 = new Thread(() => Console.WriteLine("Thread_2 is start")); thread2.Name = "Thread_2"; thread1.Start(); thread2.Start(); }
2.2 Thread.join函數
當thread1調用Join方法的時候,主線程MainThread、thread2就被停止執行,直到thread1線程執行完畢,MainThread、thread2存在交叉執行
for (int i = 0; i < 20; i++) { if (i == 4) { JoinMethodTest(); } else { Console.WriteLine($"主線程執行:{i}"); } }
static void JoinMethodTest() { Thread thread1 = new Thread(() => { for (int i = 0; i <10; i++) { Console.WriteLine("ddd"); } }); Thread thread2 = new Thread(() => { for (int i = 0; i < 10; i++) { Console.WriteLine("aaa"); } }); thread1.Start(); thread1.Join(); //等待thread1執行完再執行 thread2.Start(); }
執行結果:
//主線程執行:1 //主線程執行:2 //主線程執行:3 //ddd //ddd //ddd //ddd //ddd //ddd //ddd //ddd //ddd //ddd //主線程執行:5 //主線程執行:6 //主線程執行:7 //主線程執行:8 //主線程執行:9 //主線程執行:10 //主線程執行:11 //主線程執行:12 //主線程執行:13 //aaa //aaa //aaa //aaa //aaa //aaa //aaa //aaa //aaa //aaa //主線程執行:14 //主線程執行:15 //主線程執行:16 //主線程執行:17 //主線程執行:18 //主線程執行:19
三、前台線程及后台線程
Thread默認創建的為前台線程,可以看到當thread 為前台線程時,即使主線程執行結束,thread也會執行后程序才會結束;當threa為后台線程時,主線程執行結束,程序就結束了。
public static void BackGroundThreadTest() { Thread thread = new Thread(() => { Thread.Sleep(3000); Console.WriteLine("后台線程測試"); }); thread.IsBackground = true; thread.Start(); }
//后台方法測試 BackGroundThreadTest(); Console.WriteLine("主線程結束。。。。"); //打印結果: //主線程結束。。。。 //將方法里的thread.IsBackground = true;注釋 //打印結果: //主線程結束。。。。 //后台線程測試