在主线程执行的业务逻辑之外需要通过异步线程执行一些其他业务,异步线程通过线程池进行执行,异步线程的执行不能影响主线程的运行。
在压测过程中是发现服务报错。
2、问题定位3、问题复现1、查看日志:查看日志发现所有的异常,都是异步线程执行的异常,判断是异步线程影响了主线程的执行。
2、查看对应的代码,发现整体代码逻辑没有问题,所以可能是线程池的问题。
3、查看线程池对应配置,发现线程池对拒绝任务的处理方式为CallerRunsPolicy(交给调用线程来执行,理解为主线程进行执行),判断原因是异步线程执行异常,导致线程池队列满了,之后的异步线程改为了主线程执行。
4、线程池配置举例1、修改线程池配置,将核心线程数、最大线程数和队列最大长度改为1。
2、修改拒绝策略,直接丢弃(DiscardPolicy)、丢弃队列中最老的任务(DiscardOldestPolicy)。
3、通过JMete进行压测,查看是否出现同样问题。
1、xml中配置线程池ThreadPoolExecutor:5、解决思路2、properties文件中配置如下: #线程池相关配置 #linkedBlockingQueue队列容量 thread.pool.linkQueue.size=10 #线程池核心线程数 thread.pool.core.size=5 #线程池最大线程数 thread.pool.max.size=10 #空闲线程最大存活时间 thread.pool.keep.alive.time=2 /#时间单位 SEConDS(秒) MILLISEConDS(毫秒) MICROSEConDS(微秒) thread.pool.time.unit=SEConDS 3.java代码: public class SaveEventAdviceHolder { @Autowired private ThreadPoolExecutor pool; public void saveSerializeObjEvent(Object[] objects,SaveEventBO bo){ //设置线程池的异常策略为CallerRunsPolicy() RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy(); pool.setRejectedExecutionHandler(handler); pool.execute(new Runnable() { public void run() { //线程具体执行任务..... }); } }
1、适当的修改线程池中核心线程数、最大线程数、队列最大长度。
2、修改线程池拒绝策略,可以自定义。



