目录

前言

流程图-线程池参数是如何工作的

threadFactory

corePoolSize

workQueue

maximumPoolSize

handler

keepAliveTime和unit


前言

Java线程池和它的七个小参数

Java线程池的参数如何设置 java线程池的几个参数_java

流程图-线程池参数是如何工作的

Java线程池的参数如何设置 java线程池的几个参数_工作队列_02

threadFactory

创建线程用的线程工厂。

不设置这个参数会使用默认的线程工厂。

可以通过实现ThreadFactory接口的方式,自定义线程工厂。自定义的线程工厂,可以根据需要为每个线程设置不同的线程名,例如在线程名里带入机房编号、线程用途等。

corePoolSize

核心线程数。

线程池刚初始化时,线程数量为0。

当有新的任务提交到线程池且没有空闲线程,如果当前线程数量小于corePoolSize,那么会创建新的线程来执行这个新任务。

workQueue

工作队列。

当有新的任务提交到线程池且没有空闲线程,如果当前线程数量达到了corePoolSize,那么会将任务暂存在工作队列里。

Java提供了四种工作队列:

  1. ArrayBlockingQueue:有界阻塞队列,先进先出,底层是数组。
  2. LinkedBlockingQuene:无界阻塞队列(实际上最大容量为Interger.MAX),先进先出,底层是链表
  3. SynchronousQuene:大小为0的阻塞队列。
  4. PriorityBlockingQueue:无界阻塞队列(实际上最大容量为Interger.MAX),按优先级取任务,底层是平衡二叉树

maximumPoolSize

最大线程数。

当有新的任务提交到线程池且没有空闲线程,如果工作队列已经满了,且当前线程数量小于maximumPoolSize,那么会创建新的线程来执行这个新任务。

注意这里新提交进来的任务,会先于之前提交到工作队列中的任务执行,极端情况下,空闲线程会一直被新提交进来的任务抢占,导致工作队列里的任务一直没有机会被执行。

handler

拒绝策略。

当有新的任务提交到线程池且没有空闲线程,如果工作队列已经满了,且当前线程数量达到了maximumPoolSize,那么会执行拒绝策略。

Java提供了四种拒接策略

  1. AbortPolicy:丢弃任务,并抛出RejectedExecutionException异常。AbortPolicy是线程池默认拒绝策略。
  2. CallerRunsPolicy:在调用线程池的线程中执行任务。
  3. DiscardPolicy:只丢弃任务,不做其他事情。
  4. DiscardOldestPolicy:丢弃工作队列里的第一个任务,然后尝试将新任务加入工作队列

keepAliveTime和unit

keepAliveTime是线程允许的最大空闲时间,unit是keepAliveTime的单位,TimeUnit类里定义了unit相关常量。

当线程数量大于corePoolSize时,如果有线程的空闲时间超过keepAliveTime,那么会回收这个空闲线程。

如果设置了allowCoreThreadTimeOut,那么即使线程数量小于corePoolSize,有线程空闲时间超过keepAliveTime也会被回收。