史上最易懂详细的java线程池源码分析

java线程池源码分析

  • 线程池
    • 运行流程
    • 线程池的创建
      • 通过ThreadPoolExecutor构造函数创建
      • 通过Executors工具类创建线程
      • 源码分析(submit过程)
      • 源码分析(shutdown和shutdownNow)
    • 总结

线程池

该文章主要介绍线程池相关内容

运行流程

史上最易懂详细的java线程池源码分析_第1张图片
往线程池中提交任务的流程如上图所示:
线程池的主要作用便是线程的复用:那么线程池是如何实现线程的复用呢

线程池将每个任务的runable方法放到worker对象当中。然后启动worker线程的start方法不断从任务队列中去任务执行任务的run方法。(worker对象继承了runable方法)

线程池的创建

通过ThreadPoolExecutor构造函数创建

史上最易懂详细的java线程池源码分析_第2张图片
参数介绍如图注释。
阿里开发手册建议不用exetors工具类创建线程池:工具类的线程池默认参数容易导致资源浪费。

通过Executors工具类创建线程

  1. newFixedThreadPool 定长线程池,核心线程数=最大线程数
  2. newSingleThreadExecutor 保证单线程执行
  3. newCachedThreadPool 可缓存线程池,线程池无限大
  4. newScheduledThreadPool 定时执行队列中的任务(存储任务的队列为延迟队列)

源码分析(submit过程)

史上最易懂详细的java线程池源码分析_第3张图片

  • 第一步调用线程池的submit方法提交任务。执行线程池的execute方法。

史上最易懂详细的java线程池源码分析_第4张图片

  • execute方法主要在于处理任务是要线程池创建线程执行还是要加入队列等待线程调用执行。
  • 接着分析addWorker方法、
    史上最易懂详细的java线程池源码分析_第5张图片
    史上最易懂详细的java线程池源码分析_第6张图片
    史上最易懂详细的java线程池源码分析_第7张图片
  • addWorker主要就是创建线程,接着我们看worker类run方法的实现
    在这里插入图片描述
  • 进到runWorker中看详细逻辑
    史上最易懂详细的java线程池源码分析_第8张图片
  • 到这里我们可以验证线程池线程复用的原理就是启用线程不断取队列的中任务,执行任务的run方法。这里加重入锁的作用是线程调用shutdown时,会等当前任务的run方法执行完在中断,接着我们在看如何取task的:
    史上最易懂详细的java线程池源码分析_第9张图片
    史上最易懂详细的java线程池源码分析_第10张图片
  • 执行线程如果小于核心线程数的话,线程执行完任务会阻塞等待新的任务进来,如果大于核心线程数的话,如果设置了超时时间,那么等待一段时间后会销毁。

源码分析(shutdown和shutdownNow)

  • shutdown方法:
    史上最易懂详细的java线程池源码分析_第11张图片

  • 我们主要看执行线程中断的方法interruptIdleWorkers:
    在这里插入图片描述
    史上最易懂详细的java线程池源码分析_第12张图片

  • 可以看出shutdown方法会等待正在执行的任务执行完在中断线程。

  • 继续看一下shutdown方法,看看有什么不同:
    史上最易懂详细的java线程池源码分析_第13张图片

  • 可以看出跟shutdown没有什么本质上的区别,接着我们来看如何进行线程中断的:
    史上最易懂详细的java线程池源码分析_第14张图片

  • 可以看出中断线程上的区别:shutdownNow直接调用线程中断方法。

总结

线程池原理分析大概就是这些了,jdk源码官方下载地址:http://hg.openjdk.java.net/jdk8u 可以下载下来自行走一遍流程加深印象。

你可能感兴趣的:(java)