/**
* corePoolSize 保留在池中的线程数 即使处于空闲状态 除非设置了allowCoreThreadTimeOut
*
* maximumPoolSize *池中允许的最大线程数
*
* keepalivueTime 存活时间 如果当前线程大于core的数量
* 释放空闲的线程 maximumPoolsize-corePoolSize 只要线程空闲大于指定的keepAlivuetime
* unit:时间单位
* BlockingQUeue<Runnable> workQueue 阻塞队列 如果任务有很多 就会将目前多的任务放在队列里面
* 只要有线程空闲,就会去队列里面取出新的任务继续执行
* threadFactory 线程创建工厂
* RejectedExecutionHandler 如果队列满了 按照我们指定得拒绝策略拒绝指定任务
*
* 工作顺序
* 1)、线程池创建好 准备好core数量的核心线程,准备接受任务
* 1.1、core满了 就将在进来的任务放入阻塞队列中 空闲的core就会自己去阻塞队列获取任务执行
* 1.2、阻塞队列满了 就直接开新线程执行 最大只能开到max指定数量
* 1.3、max满了就用RejectedExecutionHandler 拒绝任务
* 1.4、max都执行完成,有很多空闲 指定时间以后keepAlivueTime以后 释放max-core(195)这些线程
*
* new LinkedBlockingQueue<>() 默认是Integer最大值 内存不够
*
* 一个线程池 core:7 max:20 queue:50 100并发进来怎么分配
* 7个会立即得到执行 50个进入队列 再开13个进行执行,剩下的30个就使用拒绝策略
* 如果不想抛弃还要执行 CallerRunsPolicy 同步方式
*/
//最原始的方式:
ThreadPoolExecutor executor = new ThreadPoolExecutor(5,
200,
10, TimeUnit.SECONDS,
new LinkedBlockingDeque<>(100000),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
//快速创建线程池
Executors.newCachedThreadPool(); //core是0 所有都可回收
Executors.newFixedThreadPool(10);//固定大小 core=max 都不可以回收
Executors.newScheduledThreadPool(10); //定时任务的线程池
Executors.newSingleThreadExecutor(); //单线程的线程池,后台从队列里面获取任务 挨个执行