2014年9月13日 星期六

[C#] 執行緒練習

一看就懂


  1.  class Program
  2.     {
  3.         static bool _done;
  4.         private static readonly object _locker = new object();
  5.         static void Main(string[] args)
  6.         {
  7.             /*
  8.             //a.執行序,並指定委派
  9.             Thread t = new Thread(WriteY);
  10.             t.Start();
  11.             //a.同時,do something on the main thread.
  12.             for (int i = 0; i < 1000; i++)
  13.             {
  14.                 Console.Write('x');
  15.             }

  16.             //b.當前執行序名稱
  17.             Console.Write(Thread.CurrentThread.Name);
  18.             */
  19.             /*
  20.             //c.join 等待此執行序結束
  21.             Thread t = new Thread(Go);
  22.             t.Start();
  23.             t.Join();
  24.             //c.休眠 Thread.Sleep(0) Thread.Yield()
  25.             Thread.Sleep(TimeSpan.FromSeconds(5));      //封鎖此執行緒五秒
  26.             Console.WriteLine("Thread  t has ended");
  27.             */
  28.            
  29.             /*
  30.             //d.Shared State  
  31.             //因為兩個執行緒都在同一個實體呼叫GOGO,所以共享_done field,結果就只會顯示一次
  32.             Program tt = new Program();     //create a common instance
  33.             new Thread(tt.GoGo).Start();
  34.             tt.GoGo();
  35.             //d.Lambda 表示式也會產生 Shared State  
  36.             bool done = false;
  37.             ThreadStart action = () =>
  38.             {
  39.                 if (!done)
  40.                 {
  41.                     {
  42.                         done = true;
  43.                         Console.Write("Done");
  44.                     }
  45.                 }
  46.             };
  47.             new Thread(action).Start();
  48.             action();
  49.             */
  50.             /*
  51.             //e.為了避免shared state影響程式
  52.             //  使用lock保護值性序安全性(thread-safe)
  53.             new Thread(LockGo).Start();
  54.             LockGo();
  55.             */
  56.             //f. 變數i都指向同一個same memory location
  57.             for (int i = 0; i < 10; i++)
  58.             {
  59.                 new Thread(() => Console.Write(i)).Start();
  60.             }
  61.             for (int i = 0; i < 10; i++)
  62.             {
  63.                 int temp = i;
  64.                 new Thread(() => Console.Write(temp)).Start();
  65.             }
  66.         }
  67.         static void LockGo()
  68.         {
  69.             //鎖定
  70.             lock (_locker)
  71.             {
  72.                 if (!_done)
  73.                 {   //所以不用擔心執行緒會同時進來,產生兩個Done問題
  74.                     Console.Write("Done");
  75.                     _done = true;
  76.                 }
  77.             }
  78.         }
  79.         private void GoGo()
  80.         {
  81.             //第二個執行緒 因為_done變成true所以沒反應
  82.             if (!_done)
  83.             {
  84.                 _done = true;
  85.                 Console.WriteLine("Done");
  86.             }
  87.             else
  88.             {
  89.                 Console.WriteLine("//第二個執行緒 因為_done變成true所以沒反應");
  90.             }
  91.         }
  92.         private static void Go(object obj)
  93.         {
  94.             for (int i = 0; i < 100; i++)
  95.             {
  96.                 Console.Write('x');
  97.             }
  98.         }
  99.         private static void WriteY(object obj)
  100.         {
  101.             for (int i = 0; i < 1000; i++)
  102.             {
  103.                 Console.Write("y");
  104.             }
  105.         }
  106.     }

沒有留言:

張貼留言