淺談線程
由於在開發生產中對線程基本未接觸,導致這塊知識一直是一知半解,於是決定對這塊進行深入了解,以下是我觀看某視頻後的觀後總結:
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(); }
淺談線程