最近在优化项目的多线程的使用方法,以前都是显示的使用线程启动,造成启动的线程多了,比较占用系统的资源,随即着手优化了下项目的线程使用方法。
一、老式方法
都是显式的调用,并且阿里巴巴开发手册并不推荐这样使用。
代码语言:javascript复制 //新建线程并执行任务类
new Thread(() -> {
System.out.println(Thread.currentThread().getName() ":异步任务");
}).start();
二、优化方法
创建线程池配置
代码语言:javascript复制@Configuration
public class AsyncConfig {
private static final int MAX_POOL_SIZE = 50;
private static final int CORE_POOL_SIZE = 20;
@Bean("asyncTaskExecutor")
public AsyncTaskExecutor asyncTaskExecutor() {
ThreadPoolTaskExecutor asyncTaskExecutor = new ThreadPoolTaskExecutor();
asyncTaskExecutor.setMaxPoolSize(MAX_POOL_SIZE);
asyncTaskExecutor.setCorePoolSize(CORE_POOL_SIZE);
asyncTaskExecutor.setThreadNamePrefix("async--pool-");
asyncTaskExecutor.initialize();
return asyncTaskExecutor;
}
}
启用异步支持
启动类上添加@EnableAsync注解
代码语言:javascript复制@SpringBootApplication
@EnableAsync
public class SpringbootAsyncApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootAsyncApplication.class, args);
}
}
在其它类中使用线程池
先注入线程池类,再使用线程类的submit方法即可
代码语言:javascript复制@Autowired
private AsyncTaskExecutor asyncTaskExecutor;
@GetMapping("/")
public String test() {
// 使用异步线程池 线程
asyncTaskExecutor.submit(() -> {
log.info(Thread.currentThread().getName() "asyncTaskExecutor");
});
return "ok";
}
这样我们就使用上了线程池的配置,也不用显式的去使用线程池了。
线程池生效啦,暂时先写到这里。
参考资料
https://huanzi-qch.gitee.io/spring-boot/#/docs/《SpringBoot
总结
腾云先锋(TDP,Tencent Cloud Developer Pioneer)是腾讯云GTS官方组建并运营的技术开发者群体。这里有最专业的开发者&客户,能与产品人员亲密接触,专有的问题&需求反馈渠道,有一群志同道合的兄弟姐妹。来加入属于我们开发者的社群吧!