1、什么是线程池
线程池:三大方法、七大参数、四种拒绝策略
OOM:Out of memory 内存溢出
程序的运行,本质:占用系统的资源!优化资源的使用!=>池化技术
线程池、连接池、内存池、对象池、常量池 //… 创建、销毁、
池化技术:事先准备好一些资源,有人要用,就来我这里拿,用完之后还给我
线程池的好处:
- 降低资源的消耗
- 提高响应的速度
- 方便管理
线程池的使用规范
线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
说明:Executors 返回的线程池对象的弊端如下:
1、 FixedThreadPool 和 SingleThreadPool:
允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。
2、 CachedThreadPool:
允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。
3、 线程池的三大方法
- 单一线程 (只能有一个线程在执行)
- 固定线程(设置最大可执行的线程数)
- 可伸缩线程(可多可少,根据电脑配置而定,本电脑最多只有32个可同时运行线程)
4、线程池的七大参数
参数一:核心线程数
参数二:最大线程数,在我们通过线程池获取线程数<=最大线程数时,只会使用核心线程数中的线程,比如上面这个参数,核心线程数为2,最大线程数为5,当我们从线程池中获取的线程数<=5时,只会使用2个核心线程数去交替完成
参数三:超时等待时间
参数四:超时等待时间的单位
参数五:阻塞队列,使用数组或者链表都可以,参数为3,可以理解为如果我们一次性从线程池获取线程数>最大线程数+阻塞队列大小,就需要使用到四大拒绝策略
参数六:线程工厂
参数七:拒绝策略
5、四种拒绝策略
new ThreadPoolExecutor.AbortPolicy() // 默认的拒绝策略,银行满了还有人进来,不处理,抛出异常
new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略,哪来的去哪里
new ThreadPoolExecutor.DiscardPolicy() // 拒绝策略, 队列满了不会抛出异常
new ThreadPoolExecutor.DiscardOldestPolicy()
// 拒绝策略,队列满了,尝试去和最早的竞争,不会抛出异常