7000字+24张图带你彻底弄懂线程池(一)

pivoteic
发布于 2022-6-17 16:51
浏览
1收藏

 

7000字+24张图带你彻底弄懂线程池(一)-鸿蒙开发者社区

大家好,我是三友。今天跟大家聊一聊无论是在工作中常用还是在面试中常问的线程池,通过画图的方式来彻底弄懂线程池的工作原理,以及在实际项目中该如何自定义适合业务的线程池。

 

一、什么是线程池

 

线程池其实是一种池化的技术的实现,池化技术的核心思想其实就是实现资源的一个复用,避免资源的重复创建和销毁带来的性能开销。在线程池中,线程池可以管理一堆线程,让线程执行完任务之后不会进行销毁,而是继续去处理其它线程已经提交的任务。

 

使用线程池的好处

  • 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
  • 提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
  • 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统 的稳定性,使用线程池可以进行统一的分配,调优和监控。

 

二、线程池的构造

 

Java中主要是通过构建ThreadPoolExecutor来创建线程池的。接下来我们看一下线程池是如何构造出来的

 

ThreadPoolExecutor的构造方法

7000字+24张图带你彻底弄懂线程池(一)-鸿蒙开发者社区

  • corePoolSize:线程池中用来工作的核心的线程数量。
  • maximumPoolSize:最大线程数,线程池允许创建的最大线程数。
  • keepAliveTime:超出 corePoolSize 后创建的线程存活时间或者是所有线程最大存活时间,取决于配置。
  • unit:keepAliveTime 的时间单位。
  • workQueue:任务队列,是一个阻塞队列,当线程数已达到核心线程数,会将任务存储在阻塞队列中。
  • threadFactory :线程池内部创建线程所用的工厂。
  • handler:拒绝策略;当队列已满并且线程数量达到最大线程数量时,会调用该方法处理该任务。

 

线程池的构造其实很简单,就是传入一堆参数,然后进行简单的赋值操作。

 

三、线程池的运行原理

 

说完线程池的核心构造参数的意思,接下来就来画图讲解这些参数在线程池中是如何工作的。

 

线程池刚创建出来是什么样子呢,如下图

7000字+24张图带你彻底弄懂线程池(一)-鸿蒙开发者社区

不错,刚创建出来的线程池中只有一个构造时传入的阻塞队列而已,此时里面并没有的任何线程,但是如果你想要在执行之前已经创建好核心线程数,可以调用prestartAllCoreThreads方法来实现,默认是没有线程的。

 

当有线程通过execute方法提交了一个任务,会发生什么呢?

 

提交任务的时候,其实会去进行任务的处理

 

首先会去判断当前线程池的线程数是否小于核心线程数,也就是线程池构造时传入的参数corePoolSize。

 

如果小于,那么就直接通过ThreadFactory创建一个线程来执行这个任务,如图

7000字+24张图带你彻底弄懂线程池(一)-鸿蒙开发者社区

文章转自公众号:三友的java日记

标签
已于2022-6-17 16:51:10修改
收藏 1
回复
举报
回复
    相关推荐