public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
/**
* 七大参数:corePoolSize:[5]核心线程数【一直存在除非(allowCoreThreadTimeOut)】;线程池创建好后就准备
* maximumPoolSize:[200]最大线程数量;控制资源
* keepAliveTime:存货时间。如果当前的线程数量大于core数量。释放空闲的线程。只要线程空闲时间大于指定的keepAliveTime
* unit:时间单位
* BlockingQueue<Runnable> workQueue:阻塞队列。如果任务有很多,jiu会将目前多的任务放在队列里面。
* 只要有线程空闲,就会去队列里面取出新的任务继续执行。
* threadFactory:线程的创建工厂。
* handler:如果队列满了,按照指定的拒绝策略拒绝执行任务
*
* 工作顺序:
* 1)线程池创建,准备好core数量的核心线程,准备接受任务
* 1.1)core满了,就将再进来的任务放入阻塞队列中。空闲的core就会自己去阻塞队列获取任务执行
* 1.2)阻塞队列满了,就直接开新线程执行,最大只能开到max指定的数量
* 1.3)max都满了,就会根据指定的拒绝策略拒绝任务
* 1.4)若max都执行完成,有很多空闲,在指定的存活时间以后,释放max-core这些线程
*
* new LinkedBlockingQueue<>()默认是Integer的最大值,可能会导致内存不够
*
*
* 例子:一个线程池 core 7; max 20, queue: 50 ,100并发进来怎么分配的;
* 答:7个立即执行,50个进入队列,新开13个线程,执行13个请求,剩下30个根据拒绝策略拒绝掉,
* 如果不想抛弃,想要执行。使用CallerRunsPolicy;
*/