java线程池源码分析
线程池
该文章主要介绍线程池相关内容
运行流程
往线程池中提交任务的流程如上图所示:
线程池的主要作用便是线程的复用:那么线程池是如何实现线程的复用呢
线程池将每个任务的runable方法放到worker对象当中。然后启动worker线程的start方法不断从任务队列中去任务执行任务的run方法。(worker对象继承了runable方法)
线程池的创建
参数介绍如图注释。
阿里开发手册建议不用exetors工具类创建线程池:工具类的线程池默认参数容易导致资源浪费。
newFixedThreadPool 定长线程池,核心线程数=最大线程数
newSingleThreadExecutor 保证单线程执行
newCachedThreadPool 可缓存线程池,线程池无限大
newScheduledThreadPool 定时执行队列中的任务(存储任务的队列为延迟队列)
第一步调用线程池的submit方法提交任务。执行线程池的execute方法。
execute方法主要在于处理任务是要线程池创建线程执行还是要加入队列等待线程调用执行。
接着分析addWorker方法、
addWorker主要就是创建线程,接着我们看worker类run方法的实现
进到runWorker中看详细逻辑
到这里我们可以验证线程池线程复用的原理就是启用线程不断取队列的中任务,执行任务的run方法。我们在看如何取task的:
执行线程如果小于核心线程数的话,线程执行完任务会阻塞等待新的任务进来,如果大于核心线程数的话,如果设置了超时时间,那么等待一段时间后会销毁。
源码分析(shutdown和shutdownNow)
shutdown方法:
我们主要看执行线程中断的方法interruptIdleWorkers:
可以看出shutdown方法会等待正在执行的任务执行完在中断线程。
继续看一下shutdown方法,看看有什么不同:
可以看出跟shutdown没有什么本质上的区别,接着我们来看如何进行线程中断的:
可以看出中断线程上的区别:shutdownNow直接调用线程中断方法。
总结
线程池原理分析大概就是这些了,jdk源码官方下载地址:http://hg.openjdk.java.net/jdk8u 可以下载下来自行走一遍流程加深印象。