(二)JDK线程池源码分析1线程池执行主流程

  • 概述
    在实际工作当中,线程池是我们经常要使用的,比如定时任务,或者需要异步执行,都是需要用到线程池的。在使用线程池的时候或许会发现一些奇怪的问题,或者说想根据现有线程池去改造一下,需要更好的满足业务需求,这个时候你就需要对线程池有足够的了解,如果你分析过源码,那么这些问题都能很好解决,利用线程池提出更好的使用方案和策略。

  • 构造方法
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    一般情况下,我们直接倾向于使用Executors这个工具类直接去创建一个线程池,比如我们使用最多的创建固定线程数量的线程池(图二)。这样的话,其实对于线程池来说除了工作线程数是我们定义的,其他的都是使用默认值,这种情况下核心线程数==最大线程数,存放任务的队列,线程池的创建线程工厂,后置处理器等都是采用默认的。

  • 使用线程执行任务
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    一般情况下,我们创建完线程池就会去执行任务,执行线程池的execute方法.图二为execute的具体执行逻辑,看到一共分了三个步骤执行.
    1-workerCountOf方法查询当前线程池中线程数量,如果小于核心线程数,那么添加一个核心线程,并且将任务直接给这个新创建的核心线程去执行,执行完毕后直接就结束.
    2-使用isRunning方法判断当前线程池状态,状态没问题,直接将当前任务添加到缓存队列中,等待空闲线程去执行.
    3.如果核心线程创建完了,并且缓存任务队列也达到了最大长度,那么需要新建(小于max数量)线程数量去执行当前任务,如果线程已经达到最大数量,那么添加线程是会失败,这个时候会调用reject方法, 这个reject方法其实就是构造传递的后置处理器实现,里面其实实现就是抛出了一个RejectedExecutionException异常,这个我们可以通过在构造的时候传递一个自己的实现去二次处理被拒绝的任务.

  • 添加线程方法1部分
    在这里插入图片描述
    a.先普及一下retry这个语法,我们平常也会使用for+continue+break,但是这样有个问题,只能在当层for循环进行继续当层下一次循环和跳出当层, 所以有时候想跳出多层会有点麻烦,retry就是解决这个问题的,retry用于标记,继续执行哪一层循环和跳出哪一层循环.
    b.这里使用了cas算法+原子类(相当于锁)去防止并发创建线程,如果是创建的核心线程,那么数量不能超过核心线程数量;如果创建的核心线程数量满了,那么创建线程数量不要超过最大线程数量.

  • 添加线程方法2部分
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20191016170807744.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODMxMjcxOQ==,size_16,color_FFFFFF,t_70
    我们可以看到,接下来就是创建一个线程,然后添加到线程池当中,去执行Worker包装的线程的start方法启动线程执行当前任务.

  • 线程包装类Worker第1部分
    在这里插入图片描述
    a.线程池内的每个工作线程结构如图所示, 有三个属性,分别是 thread(真正执行任务的线程),firstTask(执行的第一个任务),completedTasks(总共执行次数)
    b.第二个就是我们看到Worker的构造方法,重点是线程的初始化,使用构造时候的默认线程工厂去创建一个线程,并且这个线程的Runnable就是Worker,也就是说,当我们在addWorker中调用Worker.thread的start方法,其实就是调用Worker的start方法,其实Worker是一个代理线程,代理去执行我们的任务.

  • 线程包装类Worker第2部分
    在这里插入图片描述
    在这里插入图片描述
    当我们在addWorker中调用worker的thread的start方法的时候,就会触发worker的run方法,run方法开始执行runWorker方法,在这个方法中,其实是调用我们自己传递的任务对象的run方法,调用完毕后,将这个线程执行的任务数量+1,最后执行完毕再做一些别的处理.

总结:在这里我只是简单的分析了一下执行流程,后面还会进一步研究.比如线程任务执行完做什么处理,核心线程创建完任务直接丢到缓存队列中怎么触发执行,已经一些线程怎么做管理,后续都会持续更新说明.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值