聊聊为啥不推荐使用jdk自带的创建线程池方法

今天聊一聊为什么不推荐使用jdk自带的Executors静态方法下创建线程池的方法,最常见的就是以下这四种:

创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

核心线程数是,最大线程数为整型的最大值,队列大小为1,空闲保持时间60L

1. ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

创建一个指定工作线程数量的线程池。创建出来的核心线程和最大线程数为传入的指定的数量,队列长度为整形的最大值

2. ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);

和上边一样,就是这个核心线程数为和最大线程数为1

3. ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();

创建一个定长的线程池,而且支持定时的以及周期性的任务执行,支持定时及周期性任务执行。

4. ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);

前三种最长用,但是为什么不推荐用自带的方法创建线程池的,第一种方式假如同时有10000个任务,假如任务执行时间大于空闲保持时间那就要创建10000个线程去处理任务,此时就会非常

消耗CPU资源,第二种和第三种,假如任务量大的时候,绝大多数任务都会堆在队列中,非常的消耗内存,很容易OOM,所以日常开发中最好根据实际情况自己设置线程池参数,使用底层的:

ExecutorService threadPool=new ThreadPoolExecutor(2,5, 1L,TimeUnit.SECONDS, new LinkedBlockingQueue<>(3), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值