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