springboot-集成线程池
2023-09-11 14:19:58 时间
背景
以前写线程池都是使用JDK原生的自己写,线程安全自己来控制;springboot集成方式简化了使用配置,使用注解使方法异步化。我通过两种方式的对比来详细说明如何使用。
JDK原生方式
- 代码如下
- 阻塞队列是缓冲用的,可以提高吞吐量,用空间换时间,但是会有时间差,最终都会被执行,线程池本身也有一个队列,两个队列一起提高了缓冲长度
- 休眠是控速用的
public class ThreadPoolTest {
private static BlockingQueue<Thread> blockingQueue = new LinkedBlockingQueue(1000000);
private static ExecutorService executorService = Executors.newCachedThreadPool();
static {
try {
Thread t = blockingQueue.take();
while (t != null) {
System.out.println("do something!");
executorService.submit(t);
//控制取数速率
Thread.sleep(100);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void addTask() {
blockingQueue.add(new Thread(new Runnable() {
@Override
public void run() {
System.out.println("add a task!");
}
}));
}
}
springboot方式
- 创建一个service层的接口AsyncService,如下:
public interface AsyncService {
/**
* 执行异步任务
*/
void executeAsync();
}
- 对应的AsyncServiceImpl,实现如下:
@Service
public class AsyncServiceImpl implements AsyncService {
private static final Logger logger = LoggerFactory.getLogger(AsyncServiceImpl.class);
@Override
public void executeAsync() {
logger.info("start executeAsync");
try{
Thread.sleep(1000);
}catch(Exception e){
e.printStackTrace();
}
logger.info("end executeAsync");
}
}
- 创建一个controller为Hello,里面定义一个http接口,做的事情是调用Service层的服务,如下:
@RestController
public class Hello {
private static final Logger logger = LoggerFactory.getLogger(Hello.class);
@Autowired
private AsyncService asyncService;
@RequestMapping("/")
public String submit(){
logger.info("start submit");
//调用service层的任务
asyncService.executeAsync();
logger.info("end submit");
return "success";
}
}
- 创建一个配置类ExecutorConfig,用来定义如何创建一个ThreadPoolTaskExecutor,要使用@Configuration和@EnableAsync这两个注解,表示这是个配置类,并且是线程池的配置类,如下所示:
@Configuration
@EnableAsync
public class ExecutorConfig {
private static final Logger logger = LoggerFactory.getLogger(ExecutorConfig.class);
@Bean
public Executor asyncServiceExecutor() {
logger.info("start asyncServiceExecutor");
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//配置核心线程数
executor.setCorePoolSize(5);
//配置最大线程数
executor.setMaxPoolSize(5);
//配置队列大小
executor.setQueueCapacity(99999);
//配置线程池中的线程的名称前缀
executor.setThreadNamePrefix("async-service-");
//拒绝策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//执行初始化
executor.initialize();
return executor;
}
}
-
将Service层的服务异步化:打开AsyncServiceImpl.java,在executeAsync方法上增加注解@Async(“asyncServiceExecutor”),asyncServiceExecutor是前面ExecutorConfig.java中的方法名,表明executeAsync方法进入的线程池是asyncServiceExecutor方法创建的,如下:
@Override
@Async("asyncServiceExecutor")
public void executeAsync() {
logger.info("start executeAsync");
try{
Thread.sleep(1000);
}catch(Exception e){
e.printStackTrace();
}
logger.info("end executeAsync");
}
总结
- 我感觉只是书写形式发生了变化,本质上没有变化,原来怎么用现在还是怎么用
- 还是推荐使用springboot的方式,代码风格上还是统一的
- 这个跟阿里的规范不冲突
相关文章
- SpringBoot集成MyBatis-Plus代码生成器FastAutoGenerator
- 图解 K8S 中 SpringBoot Pod 如何优雅关闭,减少对用户的影响
- SpringBoot之集成Redis NoSql数据库
- 微服务,微架构[二]之springboot集成jdbc
- springboot内置tomcat调优并发线程数[转载]
- Springboot集成Swagger2的配置
- SpringBoot集成Shiro安全框架
- SpringBoot启动报错:org.apache.catalina.LifecycleException: Protocol handler start failed
- SpringBoot入门-打印请求日志
- springboot整合mybatis
- 《SpringBoot篇》18.SpringBoot整合Memcached缓存超详细教程
- 《SpringBoot篇》06.超详细热部署教学
- 《SpringBoot篇》01.Springboot超详细入门(基础篇)
- springboot(四):thymeleaf使用详解
- Redis缓存与springboot集成
- 微服务学习三:springboot与springcloud集成之Eurake的使用(server端,client端)
- 微服务学习二:springboot与swagger2的集成
- springboot中 后端跨域的实现配置
- 浅析SpringBoot默认数据源Hikari的配置详解
- Springboot集成MongoDB(MongoTemplate)
- SpringBoot集成ActiveMq消息队列实现即时和延迟处理
- SpringBoot集成RocketMQ实现各种消息类型
- IDEA从零到精通(16)之IDEA中用Spring Initializr创建springboot项目
- SpringBoot+SpringSecurity集成权限管理快速打造企业级声明式安全认证授权解决方案之SpringBoot+SpringSecurity+mybatis+mysql
- springboot依赖管理和自动配置源码分析