线程池类图如下:

es thread_pool size是啥 threadpoolexcutor参数_任务队列

使用Executors工具类创建的线程池,都是创建的ThreadPoolExecutor对象。这个对象的核心参数有7个:

1、corePoolSize 核心线程数,即便线程空闲也会一直在线程池中的线程数,除非设置允许核心线程超时的参数。

2、maximumPoolSize 最大线程数 ,线程池中允许的最大线程,包含核心线程数

3、keepAliveTime 非核心线程空闲等待时间,超过这个时间没有任务的话,非核心线程会被从线程池中销毁。

4、TimeUnit keepAliveTime的时间单位

5、BlockingQueue 任务队列,用来缓存执行excute方法的Runnable任务

6、ThreadFactory 线程工厂 创建新线程时用的工厂

7、RejectedExecutionHandler 拒绝策略, 是当任务队列满了,线程池线程数也达到最大了,这个时候,又有任务要执行的时候,执行什么策略进行处理这些任务。有四种策略

7.1) AbortPolicy: 中止策略(默认) 直接抛出RejectedExecutionException异常

7.2) DiscardPolicy: 丢弃策略 啥都不做,直接丢掉这个任务

7.3) DiscardOldestPolicy: 丢弃最早的未处理的任务策略 会丢掉最早未执行的任务,然后重试当前这个任务

7.4) CallerRunsPolicy: 调用者执行策略 如果executor没有关闭,会在执行execute方法的线程中直接调用任务的run方法。如果executor关闭了,这个任务就会被丢弃不执行。

 

任务与线程执行分配的过程:

线程池里面有线程、任务队列和Worker组成,线程分为核心线程和非核心线程。

当有任务过来的时候,首先核心线程会执行任务。

当核心线程都在执行任务的时候,新来的任务会进入任务队列。

当任务队列满了的时候, 根据线程池最大线程数,创建非核心线程来处理任务。

当所有线程都在执行任务,并且任务队列都满了的时候,新来的任务会按执行拒绝策略。

Worker我理解的是个协调调度者,当任务来的时候他负责调度线程执行任务,添加worker的时候可以指定是核心线程还是非核心线程。Worker实现了AQS和Runnable接口。