03
2020
09

为什么不建议使用 Executors静态工厂构建线程池

阿里巴巴Java开发手册,明确指出不允许使用Executors静态工厂构建线程池

原因如下:

线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险


说明:Executors返回的线程池对象的弊端如下:


1:FixedThreadPool 和 SingleThreadPool:

允许的请求队列(底层实现是LinkedBlockingQueue)长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM

2:CachedThreadPool 和 ScheduledThreadPool

允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。 

54fd6d3eeb020016b5922affd75e96f9.jpg

创建线程池的正确姿势


避免使用Executors创建线程池,主要是避免使用其中的默认实现,那么我们可以自己直接调用ThreadPoolExecutor的构造函数来自己创建线程池。在创建的同时,给BlockQueue指定容量就可以了。


private static ExecutorService executor = new ThreadPoolExecutor(10, 10,

        60L, TimeUnit.SECONDS,

        new ArrayBlockingQueue(10));


或者是使用开源类库:开源类库,如apache和guava等。

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。