1 var thread = new Thread(() => 2 { 3 Console.WriteLine("thread start:" + Thread.CurrentThread.ManagedThreadId); //ManagedThreadId為線程的id 4 Thread.Sleep(10000); 5 Console.WriteLine("thread end:" + Thread.CurrentThread.ManagedThreadId); 6 }); 7 //設置是否為後台線程: 8 // 前台線程:所有前台線程執行結束後,該進程才會關閉退出(主線程和通過Thread類創建的線程默認是前台線程) 9 // 後台線程:所有前台結束後,後台線程就會立即結束(不管是否執行完成都會結束) 10 thread.IsBackground = true; 11 thread.Start();//開啟線程,不傳遞參數 12 13 //傳遞參數的 14 var thread1 = new Thread(param => 15 { 16 Thread.Sleep(3000); 17 Console.WriteLine(param); 18 }); 19 thread1.Start("val"); 20 thread1.Join(); //等待線程執行完成(使當前調用Join的線程阻塞) 21 //暫停和恢復線程都標志為已過時了,不建議使用 22 //thread1.Suspend(); 23 //thread1.Resume(); 24 //設置線程的優先級,注意:在NT內核的Windows平台上建議不使用優先級來影響線程優先調度的行為,因為根本沒法預期一個高優先級的線程必然會先於一個低優先級的線程執行,所以也就失去了控制線程調度的價值 25 //thread1.Priority = ThreadPriority.Highest; 26 //thread1.Abort(); //暴力的終止線程,一般不建議使用
Sleep與SpinWait的區別:
使用Thread.Sleep()會導致等待過於進行切換,等待時間不准確,而且會由用戶模式切換到內核模式;使用SpinWait(一個輕量同步類型(結構體))來進行等待的處理,等待過程中會使用自旋等待,從而避免線程頻繁的用戶模式和內核模式切換,一般用於短時的等待操作:
1 //參數一為Func<bool>,就是自旋時的循環體,直到返回true或者過時為止 2 SpinWait.SpinUntil(() => 3 { 4 Console.WriteLine("Spin Waiting"); 5 return false; 6 }, 1000); 7 SpinWait.SpinUntil(() => false, 1000); //返回false會進入等待狀態,類似於Thread.Sleep()等待,但是會盤旋CPU周期,在短期內等待事件准確度都高於Sleep 8 SpinWait.SpinUntil(() => true, 1000); //返回true會自動跳出等待狀態,不再休眠,繼續執行下面的代碼
使用SpinWait做一些多線程的流程控制
1 int i = 0; 2 Task.Run(() => 3 { 4 Thread.Sleep(1000); //模擬一些操作 5 Interlocked.Increment(ref i); 6 }); 7 Task.Run(() => 8 { 9 Thread.Sleep(1000); //模擬一些操作 10 SpinWait.SpinUntil(() => i == 1); //等待1完成 11 Thread.Sleep(1000); //模擬一些操作 12 Interlocked.Increment(ref i); 13 }); 14 SpinWait.SpinUntil(() => i == 2); //等待所有流程完成 15 Console.WriteLine("Completed!");