线程池的状态(5种):
其中AtomicInteger变量ctl的功能非常强大:利用低29位表示线程池中线程数,通过高3位表示线程池的运行状态:
- RUNNING:-1 << COUNT_BITS,即高3位为111,该状态的线程池会接收新任务,并处理阻塞队列中的任务;
- SHUTDOWN: 0 << COUNT_BITS,即高3位为000,该状态的线程池不会接收新任务,但会处理阻塞队列中的任务;
- STOP : 1 << COUNT_BITS,即高3位为001,该状态的线程不会接收新任务,也不会处理阻塞队列中的任务,而且会中断正在运行的任务;
- TIDYING : 2 << COUNT_BITS,即高3位为010,该状态表示线程池对线程进行整理优化;
- TERMINATED: 3 << COUNT_BITS,即高3位为011,该状态表示线程池停止工作;
如何创建线程池
Executors工厂类
- Executors.newCachedThreadPool(); 说明: 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.
- Executors.newFixedThreadPool(int); 说明: 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
- Executors.newSingleThreadExecutor(); 说明:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照顺序执行。
- Executors.newScheduledThreadPool(int); 说明:创建一个定长线程池,支持定时及周期性任务执行。
弊端:
- FixedThreadPool 和 SingleThreadPool:
允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。 2. CachedThreadPool 和 ScheduledThreadPool: 允许的创建线程数量为 Integer.MAX_VALUE, 可能会创建大量的线程,从而导致 OOM。
ThreadPoolExecutor
虽然上述Executors提供了工具类,但是依然存在可能会导致OOM的问题,我们一般建议采用SDK内部的线程池来创建,同时也可以让使用者了解每个参数的含义,防止出现问题。 SDK内部提供了创建线程池的构造方法,如下:
/**
* @param corePoolSize:核心线程数;
* @param maximumPoolSize:线程池允许的最大线程数;
* @param keepAliveTime:保持活动时间,空闲的线程(普通线程)在超过keepAliveTime时间内没有被复用,就被销毁;
* @param unit:时间单位;
* @param workQueue:任务队列,用来存储已经被提交,即将被执行的任务;
* @param threadFactory:线程工厂,用来创建线程池中的线程;
* @param handler:拒绝策略,线程池关闭,或者最大线程数和队列已经饱和的情况下,抛出RejectedExecutionException异常;
> **Java网盘:pan.baidu.com/s/1MtPP4d9Xy3qb7zrF4N8Qpg
> 提取码:2p8n**
### 最后
**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](
)**
### ActiveMQ消息中间件面试专题
* 什么是ActiveMQ?
* ActiveMQ服务器宕机怎么办?
* 丢消息怎么办?
* 持久化消息非常慢怎么办?
* 消息的不均匀消费怎么办?
* 死信队列怎么办?
* ActiveMQ中的消息重发时间间隔和重发次数吗?
**ActiveMQ消息中间件面试专题解析拓展:**
![BAT面试文档:ActiveMQ+redis+Spring+高并发多线程+JVM](https://img-blog.csdnimg.cn/img_convert/8efa9a2953ecb956b70cefd577a9129c.png)
* * *
# redis面试专题及答案
* 支持一致性哈希的客户端有哪些?
* Redis与其他key-value存储有什么不同?
* Redis的内存占用情况怎么样?
* 都有哪些办法可以降低Redis的内存使用情况呢?
* 查看Redis使用情况及状态信息用什么命令?
* Redis的内存用完了会发生什么?
* Redis是单线程的,如何提高多核CPU的利用率?
![BAT面试文档:ActiveMQ+redis+Spring+高并发多线程+JVM](https://img-blog.csdnimg.cn/img_convert/b45eb8f2023a61c83f1e1c3143f1ba5a.png)
* * *
# **Spring面试专题及答案**
* 谈谈你对 Spring 的理解
* Spring 有哪些优点?
* Spring 中的设计模式
* 怎样开启注解装配以及常用注解
* 简单介绍下 Spring bean 的生命周期
**Spring面试答案解析拓展**
![BAT面试文档:ActiveMQ+redis+Spring+高并发多线程+JVM](https://img-blog.csdnimg.cn/img_convert/cb59884f4c4079976be33cc3bb2bcd67.png)
* * *
# 高并发多线程面试专题
* 现在有线程 T1、T2 和 T3。你如何确保 T2 线程在 T1 之后执行,并且 T3 线程在 T2 之后执行?
* Java 中新的 Lock 接口相对于同步代码块(synchronized block)有什么优势?如果让你实现一个高性能缓存,支持并发读取和单一写入,你如何保证数据完整性。
* Java 中 wait 和 sleep 方法有什么区别?
* 如何在 Java 中实现一个阻塞队列?
* 如何在 Java 中编写代码解决生产者消费者问题?
* 写一段死锁代码。你在 Java 中如何解决死锁?
**高并发多线程面试解析与拓展**
![BAT面试文档:ActiveMQ+redis+Spring+高并发多线程+JVM](https://img-blog.csdnimg.cn/img_convert/be8acb44f45db0641d658317959d642c.png)
* * *
# jvm面试专题与解析
* JVM 由哪些部分组成?
* JVM 内存划分?
* Java 的内存模型?
* 引用的分类?
* GC什么时候开始?
**JVM面试专题解析与拓展!**
![BAT面试文档:ActiveMQ+redis+Spring+高并发多线程+JVM](https://img-blog.csdnimg.cn/img_convert/3f8cee2db0c7431645e37921121b2ea9.png)
?
* JVM 内存划分?
* Java 的内存模型?
* 引用的分类?
* GC什么时候开始?
**JVM面试专题解析与拓展!**
[外链图片转存中...(img-8CrTQx4E-1631407408752)]