由于在开发生产中对线程基本未接触,导致这块知识一直是一知半解,于是决定对这块进行深入了解,以下是我观看某视频后的观后总结:
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(); }