1. 程式人生 > >多線程小結(2)

多線程小結(2)

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             //
開啟了一個新的線程 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 }
View Code

技術分享圖片

一. 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)