【Java】使用Executors创建线程池的缺点

前言

创建线程池最好不要使用Executors去创建,而是通过ThreadPoolExecutor的方式创建,通过这样子的创建方式,写的人就更加清楚线程池内部的运行规则,可以尽量避免内存溢出的情况。


Executors创建线程池的缺点

阅读下面的源码就可以发现,通过Executors创建线程池,内部仍然是通过ThreadPoolExecutor创建的,只不过人家帮你写好了参数。

newFixedThreadPool

作用:该方法返回一个固定线程数量的线程池,线程数量自定义。该方法创建的线程池最大线程数量等于核心线程数量。如果新提交的任务没有空闲的线程去处理,就会被放入阻塞队列中。

缺点:该线程池使用的阻塞队列是LinkedBlockingQueue:链表阻塞队列,默认容量为Integer.MAX_VALUE,容量过大,可能会堆积大量的任务,从而造成OOM(内存溢出)
在这里插入图片描述
newSingleThreadExecutor

作用:该方法创建了只有一个线程的线程池,如果提交的任务没有空闲的线程去处理,就会被放入阻塞队列中

缺点:该线程池使用的阻塞队列是LinkedBlockingQueue:链表阻塞队列,默认容量为Integer.MAX_VALUE,容量过大,可能会堆积大量的任务,从而造成OOM(内存溢出)
在这里插入图片描述

newCachedThreadPool

作用:该方法返回一个可根据实际需求调整线程数量的线程池。如果提交的任务没有空闲的线程处理,就会创建新的线程去处理该任务。如果有线程空闲时间超过60秒,就会被销毁

缺点:该线程池允许创建的最大线程数量为Integer.MAX_VALUE,可能会创建出大量线程,导致OOM(内存溢出)
在这里插入图片描述
newScheduleThreadPool

作用:该方法可以创建自定义核心线程容量的线程池,而且该线程池支持定时以及周期性的任务执行。

缺点:该线程池允许创建的最大线程数量为Integer.MAX_VALUE,可能会创建出大量线程,导致OOM(内存溢出)
在这里插入图片描述

最后

通过上述缺点的分析,所以线程池最好还是自己通过ThreadPoolExecutor来创建,自己定义好线程池的参数,这样自己也清楚线程池的运行规则,避免发生内存溢出的情况。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值