1. 程式人生 > >淺談線程

淺談線程

all 優缺點 前端 控制 void adp private 共享 知識

  由於在開發生產中對線程基本未接觸,導致這塊知識一直是一知半解,於是決定對這塊進行深入了解,以下是我觀看某視頻後的觀後總結:

  1、線程是在System.Threading命名空間下

  2、線程的優缺點:

    ①將任務細分,多支點工作,但多線程工作在數據交互、穩定性上存在問題

    ②多線程工作在不進行控制的前提下是無序的,即不知道哪個線程先運行完哪個線程最後結束

    ③頻繁的創建線程會造成資源的損耗

    ④當多線程運行共享同一資源的時候,會出現問題,比如搶票。但是如果進行控制(添加鎖Monitor/Lock)又會阻塞線程,違背線程創建的理念

  3、詳細說明

    線程創建的方式:

      ①Thread thread = new Thread(func)

      ②Thread thread = new Thread(new ParameterizedThreadStart(func))

      註:以上兩種方式都需要啟動thread.Start()

    線程區分:線程分為前端線程和後臺線程

      ①前端線程結束,後端線程立即結束

      ②後端線程結束,應用結束      

      ③默認線程為前端線程thread.IsBackground = false

    線程等待:thread.Join();

    線程池:線程池是為了方便線程管理提出來的,線程池添加的線程默認為後端線程

      ThreadPool.UnsafeQueueUserWorkItem(func3, "123");

    鎖:

      private static object o = new object();

      try{

        Monitor.Enter(o);

        DoSomething();

      }catch{

        ...

      }finally{

         Monitor.Exit(o);

      }  

      或

      Lock(o){

        DoSomething();

      }  

  

private static void func1()
        {
            Thread.Sleep(3000);
            for (int i = 0; i < 50; i++)
            {
                Console.WriteLine("******func1******* :" + i);
            }
        }

        private static void func2()
        {
            for (int i = 0; i < 50; i++)
            {
                Console.WriteLine("func2 :" + i);
            }
        }

        public static void func3(object o)
        {
            Thread.Sleep(2000);
            Console.WriteLine("func3"+o.ToString());
        }

        static void Main(string[] args)
        {
            //默認IsBackground=false前端線程
            //1)前端線程結束,後端線程緊接著結束
            //2)後端線程結束,

            Thread t1 = new Thread(func1);
            t1.IsBackground = true;
            t1.Start();

            Thread t2 = new Thread(func2);
            t2.Start();

            Thread t3 = new Thread(new ParameterizedThreadStart(func3));
            t3.Start("object");

            t1.Join(); //線程Main等待線程t1

            //todo 線程池
            //ThreadPool.UnsafeQueueUserWorkItem(func3, "123");
            
            //線程同步
            //同一時間只能有一個任務訪問共享的資源
            //object o = new object();
            //Monitor.Enter(o);
            //Monitor.Exit(o);
            Console.WriteLine("主線程Main");
            Console.ReadKey();
        }

淺談線程