ThreadPoolExecutor的七大参数及工作顺序

开发中为什么要使用线程池

  1. 降低资源的消耗。通过重复利用已经创建好的线程,降低线程创建和销毁带来的损耗。
  2. 提高响应速度。因为线程池中的线程数没有超过最大上限时,有的线程处于等待分配任务的状态,当任务来时无需创建新的线程就能运行。
  3. 提高线程的可管理性。线程池会根据当前系统的特点对池内的线程进行优化处理,减少创建和销毁线程带来的系统开销。无限的创建和销毁线程不仅消耗系统资源,还降低系统的稳定性,使用线程池可以进行统一分配。

七大参数:

  1. corePoolSize : 核心线程数[一直存在除非设置了allowCoreThreadTimeOut];线程池创建好(new Thread())以后就准备就绪的线程数量,就等待来接收异步任务去执行。
  2. maximumPoolSize :最大线程数;控制资源(即使100万个异步任务也按最大线程数量运行)
  3. keepAliveTime :存活时间;如果当前正在运行的线程数量大于核心数量;释放空闲线程(最大线程数-核心线程数) 只要线程空闲大于指定keepAliveTime。
  4. unit : keepAliveTime的时间单位
  5. BlockingQueue workQueue :阻塞队列;如果任务有很多,就会将目前多的任务放在队列里面,只要有线程空闲,就会去队列里面取出新的任务继续执行。
  6. threadFactory :线程的创建工厂。
  7. RejectedExecutionHandler handler :如果队列(workQueue)满了,按照指定的拒绝策略,拒绝执行任务。

工作顺序:

  1. 线程池创建,准备好corePoolSize数量的核心线程,准备接受任务。
  2. 新的任务进来,用core准备好的空闲线程执行。
    2.1. 核心线程满了,就将再进来的任务放入阻塞队列中,空闲的核心线程就会自己去阻塞队列获取任务执行。
    2.2. 阻塞队列满了,就直接开新线程执行,最大只能开到maximumPoolSize指定的值。
    2.3. max都执行好了,新建(最大线程数-核心线程数)的空闲线程会在keepAliveTime指定的时间后自动销毁,最终保持到核心线程数(core)的大小。
    2.4. 如果线程数开到了max的数量,还有新任务进来,就会使用handler指定的拒绝策略进行处理。
  3. 所有的线程都是由指定的threadFactory创建的。
posted @   fjhnb  阅读(307)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示