参考博客:Java线程池七个参数详解

Java线程池参数

1. corePoolSize 线程池核心线程大小

2. maximumPoolSize 线程池最大线程数量

3. keepAliveTime 空闲线程存活时间

4. unit 空闲线程存活时间单位

5. workQueue 工作队列

  1. ArrayBlockingQueue

    基于数组的有界阻塞队列,按FIFO排序。新任务进来后,会放到该队列的队尾,有界的数组可以防止资源耗尽问题。当线程池中线程数量达到corePoolSize后,再有新任务进来,则会将任务放入该队列的队尾,等待被调度。如果队列已经是满的,则创建一个新线程,如果线程数量已经达到maxPoolSize,则会执行拒绝策略。

  2. LinkedBlockingQuene

    基于链表的无界阻塞队列(其实最大容量为Interger.MAX),按照FIFO排序。由于该队列的近似无界性,当线程池中线程数量达到corePoolSize后,再有新任务进来,会一直存入该队列,而基本不会去创建新线程直到maxPoolSize(很难达到Interger.MAX这个数),因此使用该工作队列时,参数maxPoolSize其实是不起作用的。

  3. SynchronousQuene

    一个不缓存任务的阻塞队列,生产者放入一个任务必须等到消费者取出这个任务。也就是说新任务进来时,不会缓存,而是直接被调度执行该任务,如果没有可用线程,则创建新线程,如果线程数量达到maxPoolSize,则执行拒绝策略。
    4. PriorityBlockingQueue
    具有优先级的无界阻塞队列,优先级通过参数Comparator实现。

6. threadFactory 线程工厂

7. handler 拒绝策略

  1. CallerRunsPolicy

    在调用者线程中直接执行被拒绝任务的run方法,除非线程池已经shutdown,则直接抛弃任务。

  2. AbortPolicy

    直接丢弃任务,并抛出RejectedExecutionException异常。

  3. DiscardPolicy

    直接丢弃任务,什么都不做。

  4. DiscardOldestPolicy

    抛弃进入队列最早的那个任务,然后尝试把这次拒绝的任务放入队列

阻塞队列一共有7种

参考博客: 线程池中7种阻塞队列的介绍、区别与选择

拒绝策略有4种

新线程添加的流程?

参考博客:关于线程池的工作队列及新线程的流程顺序