发现问题
使用Java VisualVM监控项目
监视情况
在点击某复杂功能按钮完成后重复执行,监视情况如下图
根据上图线程的监控曲线,一个明显的问题每次点击后活动线程都会增加一倍。
分析问题
定位具体代码
我是采用断点+监控的方式定位,即走一步看一下线程数。
下图是具体的问题代码
线程是由
Executors.newFixedThreadPool(Integer.valueOf(maximumPoolSize))
创建核心线程产生的。每次执行这个任务前都会创建一个连接池,问题就出在创建了但没回收!
解决问题
解决方案
1.创建线程池前先判断是否已经创建,已创建使用创建好的,未创建创建。
2.创建线程池前先判断是否已经创建,已创建回收,之后再创建线程池。
根据实际业务分析我采用了方案2
修改后的代码
验证问题
如下图在重复应用某功能时发现线程不是一味增加存在了回收机制,问题解决。
总结
1.在使用线程池的时候使用完之后需要考虑回收场景。
2.线程池回收的方法:线程池类调用shutdown()
方法。
2.线程池被回收的同时时也会回收正在执行的任务的线程,此处注意具体场景。