目录
日常开发中,为了更好管理线程资源,减少创建线程和销毁线程的资源损耗,我们会使用线程池来执行一些异步任务。但是线程池使用不当,就可能会引发生产事故。今天田螺哥跟大家聊聊线程池的10个坑。大家看完肯定会有帮助的~
来源:https://juejin.cn/post/7132263894801711117
- 线程池默认使用无界队列,任务过多导致OOM
- 线程创建过多,导致OOM
- 共享线程池,次要逻辑拖垮主要逻辑
- 线程池拒绝策略的坑
- Spring内部线程池的坑
- 使用线程池时,没有自定义命名
- 线程池参数设置不合理
- 线程池异常处理的坑
- 使用完线程池忘记关闭
- ThreadLocal与线程池搭配,线程复用,导致信息错乱。
6. 使用线程池时,没有自定义命名
使用线程池时,如果没有给线程池一个有意义的名称,将不好排查回溯问题。这不算一个坑吧,只能说给以后排查埋坑,哈哈。我还是单独把它放出来算一个点,因为个人觉得这个还是比较重要的。反例如下:
/** * 关注公众号:捡田螺的小男孩 */ public class ThreadTest { public static void main(String[] args) throws Exception { ThreadPoolExecutor executorOne = new ThreadPoolExecutor(5, 5, 1, TimeUnit.MINUTES, new ArrayBlockingQueue<Runnable>(20)); executorOne.execute(()->{ System.out.println("关注公众号:捡田螺的小男孩"); throw new NullPointerException(); }); } } 复制代码
运行结果:
关注公众号:捡田螺的小男孩 Exception in thread "pool-1-thread-1" java.lang.NullPointerException at com.example.dto.ThreadTest.lambda$main$0(ThreadTest.java:17) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) 复制代码
可以发现,默认打印的线程池名字是
pool-1-thread-1
,如果排查问题起来,并不友好。因此建议大家给自己线程池自定义个容易识别的名字。其实用CustomizableThreadFactory
即可,正例如下:public class ThreadTest { public static void main(String[] args) throws Exception {