为何不建议使用Java自带的线程池

Executors

Executors是java自带的线程池。Executors 里面默认提供的几个线程池是有一些弊端的,如果是不懂多线程、或者是新手直接盲目使用,就可能会造成比较严重的生产事故。

Executors.newFixedThreadPool(10);
Executors.newSingleThreadExecutor();
Executors.newScheduledThreadPool(10);
Executors.newCachedThreadPool();

FixedThreadPool 和 SingleThreadPool

第一个,FixedThreadPool 和 SingleThreadPool 中,阻塞队列长度是Integer.Max_Value,一旦请求量增加,就会堆积大量请求阻塞在队列中,可能会造成内存溢出的问题。

Executors的FixedThreadPool方法内部。

newFixedThreadPool里面有个队列,阻塞队列长度是Integer.Max_Value,所以一旦请求量增加,就会堆积大量请求阻塞在队列中,可能会造成内存溢出的问题。

 SingleThreadPool方法同理。

CachedThreadPool 和 ScheduledThreadPool

CachedThreadPool 和 ScheduledThreadPool 中最大线程数量是Integer.Max_value,一旦请求量增加,导致创建大量的线程,使得处理性能下降。甚至可能会出现宕机的问题。

Executors的CachedThreadPool 方法内部。

ScheduledThreadPoolExecutor内部中最大大线程数量是 Integer.Max_value,所以一旦请求量增加,导致创建大量的线程,使得处理性能下降。甚至可能会出现宕机的问题。

 ScheduledThreadPool方法同理。

ThreadPoolExecutor 

为了避免这类问题出现,我们可以直接实例化 ThreadPoolExecutor,然后自己设置参数的值,从而确保线程池的可控性。
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(8,
                16,
                15,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(15),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.CallerRunsPolicy());

 参数说明:

第一个参数:指定了线程池中的线程数量,它的数量决定了添加的任务是开辟新的线程去执行,还是放到workQueue任务队列中去;

第二个参数:指定了线程池中的最大线程数量,这个参数会根据你使用的workQueue任务队列的类型,决定线程池会开辟的最大线程数量;

第三个参数:当线程池中空闲线程数量超过第一个参数时,多余的线程会在多长时间内被销毁;

第四个参数:第三个参数的单位

第五个参数:任务队列,被添加到线程池中,但尚未被执行的任务;它一般分为直接提交队列、有界任务队列、无界任务队列、优先任务队列几种;

第六个参数:线程工厂,用于创建线程,一般用默认即可;

第七个参数:拒绝策略;当任务太多来不及处理时,如何拒绝任务;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值