线程基础

Posted 郎中令

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程基础相关的知识,希望对你有一定的参考价值。

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

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. 处理异常

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

    上面的内容来自《C#线程基础》这本书,其实说的都是很简单的基础内容,看看就好.

 

 7. 应用线程

   真正项目中,会有一些线程的综合应用,包括线程池、异步多线程等等,实际项目中对于 Task、Timers 这这种用的是最多的,使用提来也方便,操作也简单。

 

以上是关于线程基础的主要内容,如果未能解决你的问题,请参考以下文章

newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段

JavaSE线程基础

Java——线程池

Java线程池详解

Java线程池详解

Java 线程池详解