多線程小結(2)
阿新 • • 發佈:2018-05-13
new 技術分享 pan read inf string show interrupt 主線程
0 .查看當前的線程信息:Thread.CurrentThread.屬性
1 private static Thread subthread ; 2 private static Thread subthread1; 3 static void Main(string[] args) 4 { 5 Thread.CurrentThread.Name = "Main線程"; 6 Console.WriteLine(Thread.CurrentThread.Name); 7 //View Code開啟了一個新的線程 8 subthread = new Thread(new ThreadStart(GetShow)); //無參數的入口方法線程 9 subthread.Start(); //開啟線程 10 subthread.Name = "無參數的入口方法線程"; 11 //又開啟了一個線程 12 subthread1 = new Thread(new ParameterizedThreadStart(GetShow)); //有參數的入口方法線程 13 subthread1.Start("實際參數");//開啟線程傳參 14 subthread1.Name = "有參數的入口方法線程"; 15 16 Console.WriteLine("主線程結束"); 17 } 18 19 static void GetShow() 20 { 21 22 Console.WriteLine(Thread.CurrentThread.Name); 23 Console.WriteLine("執行無參數的方法"); 24 }25 26 static void GetShow(object obj) 27 { 28 Console.WriteLine(Thread.CurrentThread.Name); 29 Console.WriteLine("執行有參數的方法,傳參為:" + (string)obj); 30 } 31 }
一. Sleep()阻塞線程休息方法的使用情況:
Thread.Sleep()方法用於使當前線程暫停指定的時間,然後去執行流程語句。
他的意思是,你可以讓某個線程先“謝謝”,讓其他的兄弟先幹活,他歇息“一會兒”後再幹活
1 // 參數: 2 // millisecondsTimeout: 3 // 線程被阻塞的毫秒數。 指定零 (0) 以指示應掛起此線程以使其他等待線程能夠執行。 指定 System.Threading.Timeout.Infinite 4 // 以無限期阻止線程。 5 // 6 public static void Sleep(int millisecondsTimeout); 7 // 參數: 8 // timeout: 9 // 設置為線程被阻塞的時間量的 System.TimeSpan。 指定零以指示應掛起此線程以使其他等待線程能夠執行。 指定 System.Threading.Timeout.Infinite 10 // 以無限期阻止線程。 11 public static void Sleep(TimeSpan timeout);View Code
常用於需要開啟一個不停執行某個操作,進行循環時候,需要對Thread進行阻塞,減少計算機資源的消耗,和合理的控制程序邏輯的執行。
1 private static Thread subthread ; 2 static void Main(string[] args) 3 { 4 Thread.CurrentThread.Name = "Main線程"; 5 //無參數的入口方法線程;原本的結果哈,是爭相恐後的幹活,現在 6 //GetShow的這個方法裏先“等”10s,等過了10s再執行數據。 7 //subthread相當於“卡”了10s 8 subthread = new Thread(new ThreadStart(GetShow)); 9 subthread.Start(); //開啟線程 10 subthread.Name = "無參數的入口方法線程"; 11 12 Console.WriteLine("主線程結束"); 13 } 14 15 static void GetShow() 16 { 17 while (true) 18 { 19 Console.WriteLine(Thread.CurrentThread); 20 Console.WriteLine("進行數據同步"); 21 Thread.Sleep(10000);//阻塞10000進行一次數據的同步 22 } 23 }View Code
二. Interrupt() 喚醒休眠中的線程的方法
Interrupt這個詞的意思是 中斷;打斷;插嘴;妨礙 | vi. 打斷...
1 class Program 2 { 3 private static Thread subthread ; 4 static void Main(string[] args) 5 { 6 Thread.CurrentThread.Name = "Main線程"; 7 //無參數的入口方法線程 在方法裏睡了十秒; 8 //但是在他睡的十秒的同時,主線程還在繼續工作呀 9 //就繼續執行下面的for循環,但是for循環每次輸入1s 10 //一共就用了5s; 11 //應為程序是從上而下讀取的 12 //所以下一步就調用的 subthread.Interrupt();這個方法 13 //但是,刺客的 subthread這個線程才睡了5s,所以就會被喚醒,然後結束 14 subthread = new Thread(new ThreadStart(GetShow)); 15 subthread.Name = "無參數的入口方法線程"; 16 subthread.Start(); //開啟線程 17 for (int i = 1; i <= 5; i++) 18 { 19 Thread.Sleep(1000); 20 Console.WriteLine("第{0}秒",i); 21 } 22 subthread.Interrupt(); 23 24 Console.WriteLine("主線程結束"); 25 } 26 27 static void GetShow() 28 { 29 Console.WriteLine("名稱"+Thread.CurrentThread.Name); 30 try 31 { 32 Console.WriteLine("休息十秒"); 33 Thread.Sleep(10000); 34 } 35 catch (Exception ex) 36 { 37 Console.WriteLine("線程被喚醒,只休息了5秒"); 38 Console.WriteLine(ex.Message); 39 } 40 Console.WriteLine(Thread.CurrentThread.Name); 41 } 42 }View Code
註意:
線程在休眠的那一刻,被喚醒時,Thread.Sleep()方法會拋出異常,所有要用 try { }catch (Exception ex){ }包起來;
線程在沒有休眠的那一刻被喚醒,在後面某一端時間休眠後Thread.Sleep()方法會拋出異常,所有進行 try { }catch (Exception ex){ }異常處理,避免程序死掉。
有點扭嘴,意思就是try catch 避免程序死掉。
多線程小結(2)