java线程池源码分析

线程池

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

运行流程

在这里插入图片描述
往线程池中提交任务的流程如上图所示:
线程池的主要作用便是线程的复用:那么线程池是如何实现线程的复用呢

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

线程池的创建

通过ThreadPoolExecutor构造函数创建

在这里插入图片描述
参数介绍如图注释。
阿里开发手册建议不用exetors工具类创建线程池:工具类的线程池默认参数容易导致资源浪费。

通过Executors工具类创建线程

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

源码分析(submit过程)

在这里插入图片描述

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

在这里插入图片描述

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

源码分析(shutdown和shutdownNow)

  • shutdown方法:
    在这里插入图片描述

  • 我们主要看执行线程中断的方法interruptIdleWorkers:
    在这里插入图片描述
    在这里插入图片描述

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

  • 继续看一下shutdown方法,看看有什么不同:
    在这里插入图片描述

  • 可以看出跟shutdown没有什么本质上的区别,接着我们来看如何进行线程中断的:
    在这里插入图片描述

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

总结

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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值