坏处
线程是稀缺资源 频繁的创建销毁 消耗系统资源 降低系统稳定性
场景
创建线程时间t1
销毁线程时间t2
执行线程时间t3
如果t1+t2 > t3 浪费资源
好处
降低资源消耗
提高响应速度
提高线程的可管理性
工作原理
线程池判断核心线程池中的线程是否执行任务
如果不是 创建新的线程来执行任务
线程池判断阻塞队列是否已满
如果阻塞队列没满 任务存储在阻塞队列中等待
线程池判断线程是否都处于工作状态
如果没有 创建一个新的工作线程来执行任务
如果满了 交给饱和策略处理
/**
* ThreadPoolExecutor
* corePoolSize 线程池的核心线程数 核心线程会一直存活(包括闲置状态)
* maximumPoolSize 线程池中最大线程数 当活动线程超过这个数量的时候 后面的任务会被阻塞
* keepAliveTime 线程存活时间
* 如果allowCoreThreadTimeOut 为true 作用于核心线程
* 如果allowCoreThreadTimeOut 为false 作用于非核心线程
* allowCoreThreadTimeOut会造成内存泄露 注意关闭
* unit 枚举类 keepAliveTime 单位
* workQueue 线程池中的阻塞队列 通过executor 方法存放到队列中
* SynchronousQueue 容量为0
* 等待队列容量为0 所有需要阻塞的任务必须等待池内某个线程空闲 才能继续执行
* LinkedBlockingQueue 不限容量
* 等待队列无穷大 在这种情况下不会有多于corePoolSize的线程存在 maximumPoolSize 不存在任何意义
* BlockingQueue 限制容量
* threadFactory 线程工厂 为线程池提供创建线程的功能
* handler 拒绝策略
* ThreadPoolExecutor.AbortPolicy: 丢弃任务并抛出RejectedExecutionException异常。
* ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
* ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
* ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务
* 自定义拒绝策略 实现RejectedExecutionHandler接口
*/
/**
* 线程池状态
* RUNNING 创建线程池时
* SHUTDOWN 调用shutdown()方法 线程池不接收新的任务 等待所有任务执行完毕
* STOP 调用shutdownnow()方法 线程池不接收新的任务 终止正在执行的任务
* TERMINATED 当线程池处于SHUTDOWN/STOP状态 所有任务已经销毁 缓存队列已经清空或执行完毕后
*
* 如果线程池某个线程死掉了 线程池会生成一个新的线程代替他
*/
/**
* FixedThreadPool
* 线程数量固定 空闲不会被回收 更快的响应速度 无超时机制 无大小限制
* 适合需要长时间连接的线程
* CachedThreadPool
* 只有最大线程数为int 的最大值 超时60s 当整个线程池都为闲置状态 超过60s 会被回收 几乎不占用任何系统资源
* 适合执行大量的耗时较少的任务
* ScheduledThreadPool
* 核心数量固定 非核心数量无限制 非核心线程闲置时立即被回收
* 执行定时任务和固定周期的重复任务
* SingleThreadPool
* 只有一个核心线程
* 统一所有外界任务到一个线程中 所有任务之间不考虑线程同步
*/