背景
通过单例模式可以有效的减少内存使用。但是随着压测并发数的不断提高,QRCodeTask对象不断增加,内存占用相应也会一直增加。再加上QRCodeTask任务的业务功能是合成图片,属于CPU密集型任务。如果处理的QRCodeTask任务太多,会一直占用CPU,造成其它接口响应的速度变慢。
因此可以对ThreadPoolExecutor深入研究来找到进一步优化的措施。
Java SE API文档链接如下:
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html
二.ThreadPoolExecutor介绍
1.构造函数解析
通过查看源码可以看到所有不同形参的构造函数最终都会调用到以下的构造函数。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
2.参数介绍
corePoolSize:线程池中核心线程数目,即使空闲也不回收,除非设置了allowCoreThreadTimeOut时间。当有新增任务且当前线程数小于corePoolSize时,会继续创建核心线程执行任务。当线程数达到corePoolSize时,后面新增任务都会加入到BlockingQueue队列中等待执行。
maximumPoolSize:线程池中永许达到的最大线程数母。如果BlockingQueue队列满,且当前线程数小于maximumPoolSize,则线程池会创建新的临时线程继续执行后续任务,直到线程数目达到maximumPoolSize。如果BlockingQueue使用了无界队列,此参数设置了也没有实际意义。
keepAliveTime:临时线程空闲后的存活时间,超时后空闲线程会被销毁。
unit:keepAliveTime的时间单元。单位有天(DAYS