1、线程池配置得到bean2、使用线程池
使用的目的是有个往数据库存储大量数据的逻辑太耗时,线程池批量处理减少时间、要保证子线程都存储完再主线程返回给前端。
线程池作用:1、线程池执行的一般不阻塞本线程2、循环中让线程池执行可以让多个线程同时执行减少时间(在此基础上使用CountDownLatch和await可以起到并发执行减少时间同时整个事情做完再返回前端--一句话就是加快执行操作)
线程池里的线程是复用的,上线文注意清理!
@Configuration
public class CommonThreadPoolConfiguration {
@Bean("commonThreadPoolExecutor")
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
return executor;
}
static class ContextCopyingDecorator implements TaskDecorator {
@Nonnull
@Override
public Runnable decorate(@Nonnull Runnable runnable) {//为了保证在子线程能获取到用户信息
SecurityContext securityContext = SecurityContextHolder.getContext();
return () -> {
try {
SecurityContextHolder.setContext(securityContext);
runnable.run();
} finally {
SecurityContextHolder.clearContext();//很重要,线程池里的线程是复用的,上线文注意清理!
}
};
}
}
}
@Resource
@Qualifier("commonThreadPoolExecutor")
private AsyncListenableTaskExecutor executor;
CountDownLatch countDownLatch = new CountDownLatch(rulesRespVOList.size());
下面这个在循环里用因为多个并行
executor.execute(() -> insertDb(rulesResp, groupRespVOS,countDownLatch));
主线程
countDownLatch.await();