线程池源码分析之ThreadPoolExecutor

前言

今天老吕给大家来分享下ThreadPoolExecutor 线程池的实现逻辑,大家伙认真看,一般人我不告诉他的。

线程池相关类图      

JDK中线程池相关的类结构关系图

2056f7b33691fbed7555e283ea23d180.png

获取不同特性的线程池

在Executors中可以获取到如下类型的线程池:

//下面这几种线程池的实现基础都是ThreadPoolExecutor 线程池实现类
static ExecutorService executorService1 = Executors.newFixedThreadPool(10);
static ExecutorService executorService2 = Executors.newCachedThreadPool();
static ExecutorService executorService3 = Executors.newSingleThreadExecutor();
static ExecutorService executorService4 = Executors.newScheduledThreadPool(10);
static ExecutorService executorService5 = Executors.newSingleThreadScheduledExecutor();
//它的实现比较特殊用的ForkJoinPool 线程池实现类
static ExecutorService executorService6 = Executors.newWorkStealingPool();

ThreadPoolExecutor的实现逻辑

上面6种类型的线程池,大部分是以ThreadPoolExecutor为基础来实现的,我们今天只分析 ThreadPoolExecutor的实现逻辑。

 首先看下著名的7大参数

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler)

这是我总结的7大参数的含义,很简单是吧

d4324ccd263265aa53651f9b16b2bae5.png

下面看下线程池线程数量扩张与任务队列的关系,仔细体会

1a7fc35c5a204fe52d6c8b4223546f98.png

在源码中Worker本质上就是一个Thread,只有第一个任务(firstTask)是通过构造函数传进去的,之后执行的任务都是通过任务队列获取,从而也可以看出任务的本质是实现了Runnable接口的消息而已。

最后总结下这个线程池的实现逻辑

1、一个任务过来后,除了 新增一个线程时会将任务直接送到新线程里面

2、其它情况下所有的任务都是先放入任务队列

3、线程池中的所有线程一视同仁都是从任务队列中获取任务

4、假如你的最大线程个数为100,任务队列容量为很小,比如:容量为10,在并发较高场景下就会出现 池中线程 空闲线程很多,但是客户端收到 拒绝执行的奇怪现象。如果你理解了前3点,这个现象的原因你也就知道了。

5、谢谢大家,今天就到这里,有疑问加作者微信,进群探讨。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吕哥架构

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值