首页 > 代码库 > 线程基础

线程基础

      线程比较重要,最近面试的话几乎都会问到, 日常中也会用到(不知不觉),到底线程是个什么鬼?结合最近看的几本书,这里做一个记录

1.什么是进程?线程?多线程?优点?缺点?

       对于计算机而言,每双击一个应用程序,系统都会对此程序分配一个或者多个进程,这一点打开工作管理员界面(注销)即可明白。如此,进程则可以理解为线程的容器,由系统创建,又在具体执行过程中创建了线程。而线程是进程中的独立执行单元,对于系统而言,是通过调度线程来是应用程序工作。多线程可狭义的理解程序中包含有多个单线程的执行流。

优点: 由于存在优先级、等待等机制,这使得多线程能提高CPU的利用率,当不需要某个线程时,可调用等待方法来达到目的

缺点: 线程需要占用内存,线程越多占用内存也越多; 
           多线程需要协调和管理,所以需要CPU时间跟踪线程; 
           线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;
           线程太多会导致控制成本增加,会增加不可控的的风险

 

2.使用C#创建一个线程

        public static void WirteNumber()        {            for (int i = 0; i < 10; i++)            {                Console.WriteLine(i);            }        }        public static void Maintest()        {            Thread t = new Thread(WirteNumber);            t.Start();  //執行線程        }

初看,并不觉有什么神奇之处,仅仅是多了一个Thread 对象,利用反射可以查到,Thread的构造函数有两类,一类带参数,一类不带参数

如: 不带参数(ThreadStart 委托) --     t.Start()

        带参数(ParameterizedThreadStart 委托) --  t.Start(Para)

而对于其他的简单操作,这里列表统计下

技术分享

3.前台线程和后台线程

     在一个进程中,当所有前台线程停止运行后,CLR会强制结束所有仍在运行的后台程线程,这些后台线程会被直接终止,而不会抛出异常,只有设置了IsBackground属性为True,Thread类所创建的线程才为后台线程,否则为前台线程。

    如果想让后台线程先执行完,那么可以使用 join、sleep 方法来实现

 4. 使用 C# 中的 lock 关键字

 5. 使用 Monitor 类锁定资源

     锁可以用来保护资源,常见的订票系统,比如客户每订一张票,后台系统的数据库就减少一张,如果共有1000张,当A用户下单的时刻,后台票数(资源)是被锁起来,即同一时刻只能有一个客户来下单,这样后台出票的顺序也是连续的,然后B客户下单。若多客户同时下单,后台票号就不能连贯输出。具体例子如下:

 

 6. 处理异常

     程序一单运行,就有可能出现异常,优秀的代码只是出现异常的可能性较小,如何正确的去捕捉、处理 异常,是程序中必须要考虑的问题。线程也不例外。

 

今天先写到这里,明天继续

 

线程基础