1.线程池 private Integer corePoolSize;(核心线程数) private Integer maxPoolSize;(最大线程数) private Integer queueCapacity; private Integer keepAliveSeconds;(目前线程数大于核心线程数的情况下,如果线程的空闲时间大于设置的keepAliveSeconds,则这个线程会被销毁,直到线程数小于或者等于核心线程数。简单理解就是核心线程数的线程空闲时间不受这个参数的影响,比如核心线程数是3,并且当前的线程数是3,有两个线程空闲,则默认不会销毁,除非allowCoreThreadTimeOut设置为true) private String prefixName;
private boolean allowCoreThreadTimeOut;(默认false,限定核心线程数是否可以销毁) ThreadPoolTaskExecutor 配置这几个参数
有新任务来到时:
1.如果当前的线程池的线程数还没有达到corePoolSize,不管是否有空闲的线程,都会新增加一个线程处理这个新任务
2.如果发现大于或者等于核心线程数,并且queue队列还没满,则把任务放在queue里面等待。如果queue满了,再查看maxPoolSize,如果发现现在的线程数小于maxPoolSIze,就继续创建新线程处理,如果大于等于maxPoolSize,则不能在创建新的了,要拒绝新到的任务(拒绝策略需要指定)。
在队列没满的时候,线程数是核心线程数,当队列满了,需要的话,才会增加到最大线程数
那么队列中的任务什么时候执行呢?
拒绝策略:
- AbortPolicy:直接抛出异常,后续的任务也不会执行了,这种一般业务不推荐
- CallerRunsPolicy:会用主线程去执行这个任务,可能会阻塞主线程。
- DiscardPolicy:不抛异常,任务直接丢弃
- DiscardOldestPolicy;会把队列中最先加入的任务抛弃,再加进去。
- 自定义策略
继续学习中