基于线程池ThreadPoolExecutor参数的大致理解

线程池参数的大致理解

基于ThreadPoolExecutor 的参数进行分析

  1. corePoolSize(核心线程数):线程池最少线程数的一项标准,即使空闲线程再多,也不会进行销毁,除非设置了allowCoreThreadTime参数。

  2. maximumPoolSize(线程池最大线程数量):当有任务被提交到线程池后,首先会检查是否有空闲线程,如果有,则将当前的任务提交给空闲线程进行处理,若是没有空闲线程,则会将当前任务放入到工作队列的尾部,直到工作队列被填满,这时,会取出工作队列的队首任务并且创建一个新的线程去执行该任务。这个创建的线程数量并不是无限大的,而是以maximumPoolSize作为标准,若是到达了临界点,再有任务进入到线程池中,并且工作队列是满载的,此时就会执行拒绝策略。

  3. keepAliveTime(空闲线程存活时间):如果一个线程处于空闲状态,并且线程数量大于核心线程数时,在指定时间之后,线程将会被销毁,这个指定时间是由keepAliveTime决定的。

  4. unit(空闲线程存活时间的单位):keepAliveTime的时间单位。

  5. WorkQueue(工作队列):新任务进入到线程池中,首先会判断是否具有空闲线程,若是不存在空闲线程,并且线程数达到了核心线程数时,任务会进入到工作队列中。

    • 四大工作队列:
      1. ArrayBlockingQueue: 基于数组的有界阻塞队列,按照FIFO的规则,新任务进入到队列时会被放入队尾,有界避免了资源被消耗殆尽。当线程数量到达了核心线程数,此时会将任务放入到队列中,直到队列被占满,才会创建一个新的线程来执行队首任务,当线程数量到达了最大线程数时,在有任务进来,则会执行拒绝策略。
      2. LinkedBlockedQueue: 基于链表的无界阻塞队列(最大容量是IntegerMax),按照FIFO的规则,由于该队列的特性,在线程数到达了核心线程数时,新进的任务会一直存放在该队列中。
      3. SynchronousQueue:一个不缓存任务的阻塞队列,生成者放入一个任务必须等到消费者进来消费,也就是说,该任务只要一进入到队列,并且无空闲线程和线程数量达到了核心线程数时,就会立刻创建线程,直到到达最大线程数,若后续还有线程进入,则直接执行拒绝策略。
      4. PriorityBlockedQueue:具有优先级的阻塞队列,优先级通过参数Comparator实现。
  6. ThreadFactory(线程工厂):创建一个新线程时使用的工厂,可以用来设定线程名、是否为daemon线程等等。

  7. handler(拒绝策略):当工作队列中的任务已到达最大限制,并且线程池中的线程数量也达到最大限制,这时就会执行拒绝策略

    四种拒绝策略:

    • AbortPolicy:该策略下,直接丢弃任务,并抛出RejectedExecutionException异常。

AbortPolicy策略

  • CallerRunsPolicy:该策略下,在调用者线程中直接执行被拒绝任务的run方法,如果线程池已经shutdown,则直接抛弃任务。

CallerRunsPolicy策略

  • DiscardPolicy: 该策略下,直接丢弃任务,什么都不做。

DiscardPolicy策略

  • DiscardOldestPolicy:该策略下,抛弃进入队列最早的那个任务,然后尝试把这次拒绝的任务放入队列。

DiscardOldestPolicy策略

本文借鉴了一些网上的解析,并且结合了一些自己的见解,用于当作自己的学习笔记。可能本文中会有一些错误,希望大家多多包含并且指出问题,同时也希望能帮助到大家。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值