线程池面试题(风险/如何配置/高效使用)
2021-03-02 18:40:49 0 举报
AI智能生成
线程池面试题(风险/如何配置/高效使用)
作者其他创作
大纲/内容
微信扫一扫关注公众号喜欢收藏+点赞👍 谢谢
阅读导航
线程 👉
点击跳转
CPU+JMM 👉
CAS+Volatile 👉
Synchronized 👉
JUC 👉
线程池
线程池原理 👉
线程池核心参数 👉
线程池高频面试题
ThreadLocal 👉
使用线程池的风险?
线程池自己引发的死锁
所有正在执行的线程都在等待阻塞队列中阻塞线程的结果
线程泄露
问题:线程抛出异常而没有被捕捉到时,或者永远等待用户输入的线程
解决:要么只给予它们自己的线程,要么只让它们等待有限的时间
资源不足
避免线程池过大造成资源浪费,适当的调整线程池的大小
如何高效的使用线程池?
不要对那些同步等待其它任务结果的任务排队
给可能需要很长时间的操作要指定最长等待时间
理解任务,有效地调整线程池大小
Executor 和 Executors 的区别?
Executor 是接口,Executors 是工具类
Executors
Executors.newFixedThreadPool(10);创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
CorePoolSize: nMaximumPoolSize: nkeepAliveTime: 0 LinkedBlockingQueue
只有10个核心线程工作
使用无界队列
Executors.newCachedThreadPool();创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程
CorePoolSize: 0MaximumPoolSize: maxkeepAliveTime: 60LSynchronousQueue
没有核心线程,都是临时线程
最大线程数是Integer.Max_Value
Executors.newSingleThreadExecutor();创建一个font color=\"#662c90\
CorePoolSize: 1MaximumPoolSize: 1keepAliveTime: 0LinkedBlockingQueue
只有一个核心线程工作
为什么不推荐使用以上3种线程池?
因为newFixedThreadPool和newSingleThreadExecutor使用的是LinkedBlockingQueue而newCachedThreadPool的线程数又无限大,容易引发内存溢出的问题
底层原理都是使用ThreadPoolExecutor
生产环境如何合理配置线程池?
点击跳转 👉
扫码关注公众号,回复“线程池”领取密码
如果线上突然宕机,线程池中队列的请求怎么办?
数据会丢失, 可以在提交任务到队列前在数据库中插入一条任务信息,并更新其状态,系统重启后启动后台线程去数据库中扫描未提交的任务信息重新添加到线程池中
关于作者
我的博客 👉
章鱼猫
微信公众号 👉
编程书籍推荐
GitHub 导航 👉
网址导航
ProcessOn 主页 👉
0 条评论
下一页