线程池
SpringBoot + 线程池 使用
-
- 自定义线程池
- 定义一个线程池配置类
-
@Configurable @EnableAsync //开启线程池,应用启动时开启 public class ThreadPoolConfig { @Bean("taskExecutor") public Executor asyncServiceExecutor(){ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); //设置核心线程数:线程池创建时初始化的线程数 executor.setCorePoolSize(5); //设置最大线程数:只有在缓冲队列满了之后才会申请超过核心线程数的线程 executor.setMaxPoolSize(20); //配置队列大小:用来缓冲执行任务的队列 executor.setQueueCapacity(500); //设置线程空闲时间(秒):当超过了核心线程之外的线程在空闲时间达到后会被销毁 executor.setKeepAliveSeconds(60); //设置线程池的前缀:方便我们定位处理任务所在的线程池 executor.setThreadNamePrefix("thread-pool-task"); //缓冲队列满了之后的拒绝策略:由 调用线程处理(一般是主线程) executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy()); //等待所有任务结束后再关闭线程池 executor.setWaitForTasksToCompleteOnShutdown(true); //执行初始化 executor.initialize(); return executor; } }
-
- 定义一个专门执行异步操作的线程服务类,用来调用线程池执行异步任务
-
@Component @Slf4j public class ThreadService { //期望此操作在线程池执行 不会影响原有的主线程 @Async("taskExecutor") public void updateXXX(LotteryCalculatePerMapper lotteryCalculatePerMapper,Long id){ try{ Thread.sleep(1000); lotteryCalculatePerMapper.getById(id); }catch (Exception e){ log.error(e.getMessage()); } } }
-
- 调用线程服务类执行任务
- threadService.updateXXX(lotteryCalculatePerMapper,id)
- 定义一个线程池配置类
- 使用SpringBoot自带的线程池
- 通过上线文查看SpringBoot默认注册的线程池
-
@EnableAsync // 启用异步 @EnableCaching // 启用缓存 @EnableScheduling // 启动定时任务 @SpringBootApplication // springboot本尊 @EnableTransactionManagement // 启动注解事务管理 @Slf4j public class SpServerApplication { public static void main(String[] args) { //可通过上线文找到SpringBoot默认注册的线程池及其情况 ConfigurableApplicationContext context = SpringApplication.run(SpServerApplication.class, args); ConfigurableListableBeanFactory beanFactory = context.getBeanFactory(); ThreadPoolTaskExecutor applicationTaskExecutor = (ThreadPoolTaskExecutor)beanFactory.getSingleton("applicationTa
-
- 通过上线文查看SpringBoot默认注册的线程池
- 自定义线程池