最近在做推送相关的模块,在群推时发现添加log效率比较低,特别是批量update操作,所以使用异步操作log比较好
建一个类AsynPushRecord,写从初始化方法设置线程基础参数
@PostConstruct
public void init() {
BlockingQueue<Runnable> taskQueue = new ArrayBlockingQueue<Runnable>(1024);
threadPoolExecutor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors() * 2, Runtime.getRuntime().availableProcessors() * 4, 60, TimeUnit.SECONDS, taskQueue);
threadPoolExecutor.allowCoreThreadTimeOut(false);
}
关于的ThreadPoolExecutor用法看看这个:https://www.cnblogs.com/zedosu/p/6665306.html
public void insertBanch(DriverPushRecordDTO driverPushRecordDTO, List<DriverAppPO> list) {
threadPoolExecutor.execute(new BanchPORecord(driverPushRecordDTO, list));
}
建一个方法用于insert,传入对象以及要insert的参数,实例化内部类调用execute开始执行
内部类
public class BanchPORecord implements Runnable{
private List<DriverAppPO> list;
private DriverPushRecordDTO driverPushRecordDTO;
public BanchPORecord(DriverPushRecordDTO driverPushRecordDTO, List<DriverAppPO> list){
this.driverPushRecordDTO = driverPushRecordDTO;
this.list = list;
}
@Override
public void run() {
driverPushRecordDao.insertBatch(list, driverPushRecordDTO);
}
}
run执行动作异步添加log
我测了下果然有所见效,下面分别是1000条,5000条,10000条测试用例
1000 | 5000 | 10000 | |
线程不使用比使用多出(秒) | 1s | 3s | 5s |
这只是简单应用记录,要弄明白原理并且知道什么场景用