一、问题描述
频繁的创建、销毁线程和线程池,会给系统带来额外的开销,也有可能导致系统内线程数上限不可控。例如以下代码,每次发送邮件都会创建一个新的线程池,并且业务结束之后线程池也未随之销毁。
public static boolean sendMail(MailInfo mailInfo, MailServerInfo mailServerInfo) {try {ExecutorService executorService = Executors.newCachedThreadPool();Future<Boolean> future = executorService.submit(() -> {try {return asyncSendEmail(mailInfo, mailServerInfo);} catch (Exception e) {return false;}});return future.get(10, TimeUnit.SECONDS);} catch (Exception e) {LOG.error(e.getMessage(), e);return false;}
}
这种情况下,随着访问数增加,系统内线程数持续增长,CPU负载逐步提高。极端情况下,甚至可能会导致CPU资源被吃满,整个服务不可用。为了解决上述问题,可增加统一线程池配置,替换掉自建线程和线程池。
二、自建线程池
我们可以在一个Spring的