ThreadPoolExecutor 7个参数:
corePoolSize: 核心线程数线程数定义了最小可以同时运行的线程数量。maximumPoolSize: 当队列中存放的任务达到队列容量的时候,当前可以同时运行的线程数量变为最大线程数。workQueue: 当新任务来的时候会先判断当前运行的线程数量是否达到核心线程数,如果达到的话,新任务就会被存放在队列中。keepAliveTime:当线程池中的线程数量大于corePoolSize的时候,如果这时没有新的任务提交,核心线程外的线程不会立即销毁,而是会等待,直到等待的时间超过了keepAliveTime才会被销毁。unit:keepAliveTime参数的时间单位。threadFactory:executor 创建新线程的时候会用到的线程工厂。handler:饱和策略。
阻塞队列:
- ArrayBlockingQueue :由数组结构组成的有界阻塞队列。
- LinkedBlockingQueue :由链表结构组成的有界阻塞队列。
- PriorityBlockingQueue :支持优先级排序的无界阻塞队列。
- DelayQueue: 使用优先级队列实现的无界阻塞队列。
- SynchronousQueue: 不存储元素的阻塞队列。
- LinkedTransferQueue: 由链表结构组成的无界阻塞队列。
- LinkedBlockingDeque: 由链表结构组成的双向阻塞队列。
ThreadPoolExecutor 饱和策略
如果当前同时运行的线程数量达到最大线程数量并且队列也已经被放满了时,ThreadPoolExecutor 执行定义的策略:
ThreadPoolExecutor.AbortPolicy:抛出RejectedExecutionException来拒绝新任务的处理,默认策略。ThreadPoolExecutor.CallerRunsPolicy:调用执行自己的线程运行任务,也就是直接在调用execute方法的线程中运行被拒绝的任务,如果执行程序已关闭,则会丢弃该任务。当业务要求任何一个任务都要被执行的话,可以选择这个策略。ThreadPoolExecutor.DiscardPolicy: 不处理新任务,直接丢弃掉。ThreadPoolExecutor.DiscardOldestPolicy: 丢弃队列最前面的任务,也就是最早进入线程池的未处理的任务。
private static final int CORE_POOL_SIZE = 5; private static final int MAX_POOL_SIZE = 10; private static final int QUEUE_CAPACITY = 100; private static final Long KEEP_ALIVE_TIME = 0L;
private static ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("test-pool-%d").build();
public static void main(String[] args) {
//阿里巴巴推荐的创建线程池的方式
ThreadPoolExecutor executor = new ThreadPoolExecutor(
CORE_POOL_SIZE,
MAX_POOL_SIZE,
KEEP_ALIVE_TIME,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(QUEUE_CAPACITY), namedThreadFactory,
new ThreadPoolExecutor.CallerRunsPolicy());
}