创建线程池,为什么尽量不用Executors?

创建线程池,为什么尽量不用Executors?

《阿里巴巴Java开发手册》中强制线程池不允许使用 Executors 去创建,而是通过 new ThreadPoolExecutor 实例的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。

1.FixedThreadPool 和 SingleThreadExecutor : 允许请求的队列长度为 Integer.MAX_VALUE,可能堆积大量的请求,从而导致OOM。
2.CachedThreadPool 和 ScheduledThreadPool : 允许创建的线程数量为 Integer.MAX_VALUE ,可能会创建大量线程,从而导致OOM。

Executors类创建线程池的时候实际就是调用ThreadPoolExecutor类的构造方法来创建。

a、Executors创建FixedThreadPool,SingleThreadExecutor传入的最后一个参数阻塞队列 ”workQueue“,默认的长度是INTEGER.MAX_VALUE,而它们允许的最大线程数量又是有限的,所以当请求线程的任务过多线程不够用时,它们会在队列中等待,又因为队列的长度特别长,所以可能会堆积大量的请求,导致OOM。

b、Executors在创建 CachedThreadPool 和 ScheduledThreadPool时, 它们的阻塞队列长度有限,但是传入的第二个参数maximumPoolSize 为Integer.MAX_VALUE,这就意味着当请求线程的任务过多线程不够而且队列也满了的时候,线程池就会创建新的线程,因为它允许的最大线程数量是相当大的,所以可能会创建大量线程,导致OOM。

 

下面是2种创建线程池的示例,使用ThreadPoolExecutor构造方法更为灵活,且能够避免Executors创建带来的oom风险。

ExecutorService executorService=Executors.newFixedThreadPool(10);
Executor myThread=new ThreadPoolExecutor(10,100,0L, TimeUnit.SECONDS,new PriorityBlockingQueue());

 

免责申明:本站所有资源收集于互联网,仅用于学习和研究,若用于违法,与本站无关。若有侵权,请联系客服删除。(49vps.com)
49vps官网-属于你的精品资源网! » 创建线程池,为什么尽量不用Executors?