线程池参数:
corePoolSize
线程池的基本大小, 当提交一个任务到线程池的时候,线程池会创建一个线程来执行任务,即使当前线程池已经存在空闲线程,仍然会创建一个线程,等到需要执行的任务数大于线程池基本大小时就不再创建。如果调用线程池的prestartAllCoreThreads()
方法,线程池会提前创建并启动所有的基本线程。maximumPoolSizeSize
线程池最大数量,线程池允许创建的最大线程数,如果队列满了,并且已创建的线程数小于最大线程数,则线程池会再创建新的线程执行任务。值得注意的是,如果使用了无界的任务队列这个参数就没什么效果。keepAliveTime
线程活动保持时间,线程池的工作线程空闲后,保持存活的时间,所以,如果任务很多,并且每个任务执行的时间比较短,可以调大时间,提高线程的利用率。TimeUnit
线程活动保持时间的单位,可选择的单位有时分秒等等。BlockingQueue
阻塞队列。用来暂时保存任务的工作队列threadFactory
用于创建线程的工厂
阻塞队列:
- ArrayBlockingQueue:是一个基于数组结构的有界阻塞队列,此队列按照FIFO(先进先出)原则对元素进行排序
- DelayQueue
- LinkedBlockingDeque
- LinkedBlockingQueue:是一个基于链表结构的有界阻塞队列,此队列按照FIFO排序元素,吞吐量高于ArrayBlockingQueue。静态工厂方法Executors.newFixedThreadPool(n)使用了此队列
- LinkedTransferQueue
- PriorityBlockingQueue:一个具有优先级的无限阻塞队列
- SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等待另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量要高于LinkedBlockingQueue,静态工厂方法Executors.newCachedThreadPool()使用了此队列
拒绝策略:
当队列和线程池都满了,说明线程池处于饱和的状态,那么必须采取一种策略处理提交的新任务。这个策略默认是AbortPolicy
,表示无法处理新任务时抛出异常
- ThreadPoolExecutor.AbortPolicy:直接抛出异常
- ThreadPoolExecutor.CallerRunsPolicy:只用调用这所在的线程来运行任务
- ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务
- ThreadPoolExecutor.DiscardPolicy:不处理,丢弃掉