线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式。
说明:Executors返回的线程池对象的弊端如下:
1) FixedThreadPool 和 SingleThreadPool
允许的请求队列长度为Integer.MAXVALUE,可能会堆积大量的请求,从而导致OOM
2) CachedThreadPool:
允许的创建线程数量为Integer.MAXVALUE,可能会创建大量的线程,从而导致OOM.
用的是没有指定长度的 LinkedBlockingQueue,点进去看一下是:
没有指定长度,默认长度是 Integer.MAX_VALUE,可以理解为无界队列了:
所以,使用 LinkedBlockingQueue 是可能会导致 OOM 的。
所以推荐:这么写
static ThreadFactory factory = new ThreadFactoryBuilder() .setNameFormat("************").build(); @Bean public ExecutorService getExecutorService() { return new ThreadPoolExecutor(100, 1024, 30L, TimeUnit.SECONDS, new LinkedBlockingDeque<>(2048), factory, new ThreadPoolExecutor.AbortPolicy()); }