线程池的执行流程
官方文档里ThreadPool的构造方法最多参数的一组是这样表示的:
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
Creates a new ThreadPoolExecutor with the given initial parameters.
理解 ThreadPoolExecutor 构造方法的参数
把创建一个线程池想象成开个公司 . 每个员工相当于一个线程 .
corePoolSize: 正式员工的数量 . ( 正式员工 , 一旦录用 , 永不辞退 )
maximumPoolSize: 正式员工 + 临时工的数目 . ( 临时工 : 一段时间不干活 , 就被辞退 ).
keepAliveTime: 临时工允许的空闲时间 .
unit: keepaliveTime 的时间单位 , 是秒 , 分钟 , 还是其他值 .
workQueue: 传递任务的阻塞队列
threadFactory: 创建线程的工厂 , 参与具体的创建线程工作 .
RejectedExecutionHandler: 拒绝策略 , 如果任务量超出公司的负荷了接下来怎么处理 .
线程池的拒绝策略
- AbortPolicy(): 超过负荷 , 直接抛出异常 .
- CallerRunsPolicy(): 调用者负责处理
- DiscardOldestPolicy(): 丢弃队列中最老的任务 .
- DiscardPolicy(): 丢弃新来的任务 .
ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(5, // 核心线程数 10, // 最大线程数 5, // 线程空闲时长 TimeUnit.SECONDS, // 线程空闲时长的时间单位 new LinkedBlockingQueue<>(100), // 任务队列 new ThreadPoolExecutor.DiscardPolicy()); // 拒绝策略为忽略最新任务