ThreadPoolExecutor线程池以及核心线程

ThreadPoolExecutor原理分析

先看一下ThreadPoolExecutor构造器方法(参数最多的那个)

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
       //参数的初始化
       .......
    }

参数解析:

  1. corePoolSize :线程池中的核心线程数
  2. maximumPoolSize:线程池允许的最大线程数,BlockingQueue满了,当线程池中的线程数< maximumPoolSize时,当有新的任务到来时,会继续创建新的线程去处理
  3. keepAliveTime:线程空闲下来后,存活的时间,这个参数只在线程池中线程数量>corePoolSize才有效
  4. unit : 存活时间单位值(秒,毫秒等)
  5. workQueue : 保存任务的阻塞队列
  6. threadFactory:创建线程的工厂,给新建的线程赋予名字
  7. handler : 任务饱和拒绝策略
    AbortPolicy: 默认直接抛出异常;
    CallerRunsPolicy: 用调用者所在的线程来执行任务;
    DiscardOldestPolicy: 丢弃阻塞队列里面最老的任务,队列里面最靠前的任务;
    DicardPolicy: 当前任务直接丢弃
    当然我们也可以实现RejectedExecutionHandler接口来实现自己的饱和拒绝策略

图解:
在这里插入图片描述

  1. 当线程池中的线程(已开启的线程)个数 < corePoolSize时,每次进来新的任务,就启动一个线程去处理这个任务;
  2. 当线程池中的线程个数 > corePoolSize时,这时每次进来的任务会加入到BlockingQueue队列中;
  3. 当线程池中的线程个数 >= corePoolSize且< maximumPoolSize, 并且BlockingQueue队列也满了,这个时候再来新的任务时,就会继续创建新的线程去处理。这个时候创建的线程,当这些线程空闲下来的时候到keepAliveTime结束就会销毁;
  4. 当线程池中的线程数 >= maximumPoolSize时,这个时候再来新的任务,就会执行拒绝策略。

核心线程是如何创建以及不被销毁的?

在这里插入图片描述

如何正确的创建线程池线程池是如何保证核心线程不被销毁以及重复利用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值