1、spring自带的线程池使用的是org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor类
类中会默认定义数量锁、核心线程数、最大线程数、线程空闲存活时间、队列的长度、是否允许核心线程超时这5个参数。
数量锁是当set/get这些参数时,都要先获取这把锁,保证同一时间点内,只有一个线程能对数据进行读取和操作。
最大线程数与队列长度都默认设定了int的最大值。
【重点】是当核心线程数占用满了的时候,新来的调用会放到队列中,当队列中装满时,核心线程又没有释放,这个时候才回创建新的线程,不是当线程池到达了最大线程数才回把新的调用放入到队列中。
队列使用的是阻塞队列BlockingQueue,默认创建的链式阻塞队列,里面的数据结构是链表,如果设置了队列长度为0,则就队列会初始化为同步队列。
在java中队列的种类有很多种,其中BlockingQueue对多线程来说是最友好的,它是一种阻塞队列。
Queue中包含了offer、poll、peek方法,offer方法会有返回值表示添加是否成功。
BlockingQueue继承了Queue,新增了take、put两个阻塞的方法。由子类进行具体实现。
在spring中可以自己定义拒绝策略,或者使用java自带的拒绝策略。