进程 VS 多线程和线程池

        最近对多线程和 Android 中的线程池非常感兴趣,所以挤出时间就整理了一下,整理的时候有很多专业术语不怎么懂,所以自己列举了很多例子来理解,希望对你理解多线程和线程池有帮助。

线程与进程

  一、进程和线程的含义       

         进程:进程是拥有资源的基本单位。

         线程:线程是CPU调度的基本单位。

 二、举个例子就让你明白的彻彻底底了。

        比如我们手机有两个进程要进行,一个是便签,另一个是绝地求生。

        便签进程运行要打开保存文本的文件,这里的“打开文件”我们就叫它资源;绝地求生进程要通过监听用户按键事件,这里的“监听用户按键事件”叫做它的资源。

        我们都知道便签软件有自动保存的功能这个功能在t1线程中执行,用户编辑文本在t2线程中执行;绝地求生假设也有两个线程t3和t4,t3线程负责QE 歪头,t4线程负责开枪。上边我所给出的概念是『线程是CPU调度的基本单位』CPU在调度的时的基本单位不是打开便签和绝地求生两个进程,而是t1、t2、t3、t4四个线程。

    图解:

   

                                                                                进程与线程的区分(图 1)


注意:一个进程至少要有一个线程

    如果一个进程没有多线程,你玩绝地求生的时候怎么能边歪头边射击呢?单线程只能干一件事,事件不能并发进行,浪费 CPU 资源。所谓的多进程就是绝地求生运行在后台的同时,你使用便签进行文字记录。进程是一个软件在运行,线程就是执行进程中的线程代码片段

线程池:

    1、概念:

            ① 有了多线程编程为何还要引进线程池的概念呢?

            线程池对于我们开发者创建来说很简单方便,但是对服务器来说负担很沉重,每个用户请求登录软件都要开启一个线程,创建的线程就会很多,你想想那么多的线程去竞争 CUP 资源,持续切换,这个 CUP 的调度不是要累死的节奏吗?为了解决这个问题,就引进了线程池的概念,通过线程池提前创建一定数量的线程,不用等任务来了在创建,提前创建线程的作用就是当系统有任务来了之后就直接去执行任务。如果有任务来了,线程池的线程就会去执行任务,执行完后不销毁直接回到线程池等待执行下一个任务。我们所说的线程就是代码的执行,动态创建的。

        ② 线程的创建是通过 .start 开启的,一旦开启线程就会自动执行 run 方法。那么一个新的问题来了,任务还没来呢?提前创建一个线程之后直接执行 run 方法了。

        其实线程池还有重要的一点,就是当线程池刚创建时,让其进入堵塞状态,等待系统任务的到来;如果任务来了,我们就把第一位线程同学叫醒拿着老师的任务去干活。

        ③ 怎么让线程池进入堵塞状态呢?

        BlockingQueu 作为线程容器,可以为线程同步提供有力的保障。BlockingQueue 很容易理解,它就是一个容器,用来存放系统的任务的。线程池的线程调用它的 take() 方法取出任务进行执行,如果 BlockingQueue 没有可执行任务,该线程就会阻塞;该线程可以通过调用 put 方法放入任务,如果任务满了线程也会阻塞。

        图解:


也就是说在线程池中的每个Run方法中都要有一个循环判断BlockingQueue有没有可执行的任务,如果有就去执行,执行完回来再BlockingQueue中继续获取任务,如果BlockingQueue没有可执行任务了,线程就处于阻塞等待状态。






                  


猜你喜欢

转载自blog.csdn.net/qq_36903042/article/details/80573153