
回复
大家好,我是三友。今天跟大家聊一聊无论是在工作中常用还是在面试中常问的线程池,通过画图的方式来彻底弄懂线程池的工作原理,以及在实际项目中该如何自定义适合业务的线程池。
一、什么是线程池
线程池其实是一种池化的技术的实现,池化技术的核心思想其实就是实现资源的一个复用,避免资源的重复创建和销毁带来的性能开销。在线程池中,线程池可以管理一堆线程,让线程执行完任务之后不会进行销毁,而是继续去处理其它线程已经提交的任务。
使用线程池的好处
二、线程池的构造
Java中主要是通过构建ThreadPoolExecutor来创建线程池的。接下来我们看一下线程池是如何构造出来的
ThreadPoolExecutor的构造方法
线程池的构造其实很简单,就是传入一堆参数,然后进行简单的赋值操作。
三、线程池的运行原理
说完线程池的核心构造参数的意思,接下来就来画图讲解这些参数在线程池中是如何工作的。
线程池刚创建出来是什么样子呢,如下图
不错,刚创建出来的线程池中只有一个构造时传入的阻塞队列而已,此时里面并没有的任何线程,但是如果你想要在执行之前已经创建好核心线程数,可以调用prestartAllCoreThreads方法来实现,默认是没有线程的。
当有线程通过execute方法提交了一个任务,会发生什么呢?
提交任务的时候,其实会去进行任务的处理
首先会去判断当前线程池的线程数是否小于核心线程数,也就是线程池构造时传入的参数corePoolSize。
如果小于,那么就直接通过ThreadFactory创建一个线程来执行这个任务,如图
文章转自公众号:三友的java日记