线程池经常被面试问到,引起了我的重视,于是花了几个小时看了线程池的源码,做了如下总结
一、线程池主要配置
1.核心线程数corePoolsize
2.maxPoolSize最大线程数
3.缓冲队列
4.拒绝策略
二、线程池的工作原理
线程池根据配置初始化规定数量的核心线程,缓冲队列和拒绝策略,并发线程不是非常大的情况,当核心线程用完了,则新增线程入队列等待,当队列满了,则申请最大值maxSize线程数继续处理队列的线程,如果当并发线程的数量超过队列并且并发数也超过max的则启动拒绝策略,抛出异常(默认策略),当然你可以重写自定义拒绝策略满足你的业务需求,等线程池空闲下来,会回收多余核心线程数的空闲线程。
三、四种拒绝策略模式:
默认策略:当线程数>core数,并且队列满了,直接抛出rejectException。
抛弃策略:当线程数>core数,并且队列满了,不处理,不抛出异常。
移除策略:当线程数>core数,并且队列满了,移除旧的队列的等待数据。
接受 策略:当线程数>core数,并且队列满了,直接用调用者所在线程处理。
四、线程池种类:
single:单线程串行执行。
fix:指定大小的线程
不指定线程数的线程
当消费速度比生产者多,比如秒杀业务,会将超过核心的线程回收。