并发编程之ThreadPoolExecutor源码分析


前言

很久没写博客了,今天分享下阅读ThreadPoolExecutor线程池的核心流程的一些源码分析

关于提交优先级和执行优先级

线程池提交任务流程:核心线程创建,阻塞队列存放,最大线程数创建。
我们知道阿里的规约中明确不让使用,

newFixedThreadPool,newSingleThreadExecutor,newCachedThreadPool

我简单贴个图
在这里插入图片描述
为什么不行,注意2处,最大线程数为Integer.MAX_VALUE,可以简单理解为无限。
队列是SynchronousQueue,这是个同步队列,典型的生产者和消费者模型。当队列有任务,必须take后才能继续加入队列。
此时任务若执行时间很长,队列满的,则会创建非核心线程,但是最大线程数无限,高并发情况会拖垮机器CPU。
在这里插入图片描述
这个就是属于只有1个核心线程数,最大线程也是1。相当于一个工厂只有1个员工兼职老板。当然不推荐
在这里插入图片描述
注意这个是核心线程数和最大线程数相同,相当于没有外包干活。

提交优先级就是一个任务来了之后,是如何提交。
在这里插入图片描述

在这里插入图片描述
此处的work就是干活的人,其内部有个线程属性
在这里插入图片描述
在这里插入图片描述

当执行完start方法。就会执行work中的run方法

work的run方法
在这里插入图片描述
此时开始执行任务
什么是执行优先级?
在这里插入图片描述
当核心线程和非核心线程有任务时,便会去执行,而队列中的任务,则会等执行完毕后才去执行,这就是执行优先级:
会先把核心线程和非核心线程的任务执行完毕,再去队列中拿任务执行。

关于线程池的执行和Thread.start的区别

在这里插入图片描述

直接调用传过来的任务的方法。

在这里插入图片描述

 addWorker(null, false);

相当于创建个线程,然后去队列获取任务执行。也就是线程复用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值