实例讲解spring boot 多线程
Spring通过任务执行器(TaskExecutor)来实现多线程和并发编程。使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor。而实际开发中任务一般是非阻塞的,即异步的,所有我们在配置类中通过@EnableAsync开启对异步任务的支持,并通过在实际执行的Bean的方法中使用@Async注解来声明其是一个异步任务。
一、配置类
packagecom.cenobitor.taskxecutor.config;
importorg.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.scheduling.annotation.AsyncConfigurer;
importorg.springframework.scheduling.annotation.EnableAsync;
importorg.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
importjava.util.concurrent.Executor;
@Configuration
@EnableAsync
publicclassTaskExecutorConfigimplementsAsyncConfigurer{
@Override
publicExecutorgetAsyncExecutor(){
ThreadPoolTaskExecutortaskExecutor=newThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(5);
taskExecutor.setMaxPoolSize(10);
taskExecutor.setQueueCapacity(25);
taskExecutor.initialize();
returntaskExecutor;
}
@Override
publicAsyncUncaughtExceptionHandlergetAsyncUncaughtExceptionHandler(){
returnnull;
}
}
1、利用@EnableAsync注解开启异步任务支持
2、配置类实现AsyncConfigurer接口并重写getAsyncExecutor方法,并返回一个ThreadPoolTaskExecutor,这样我们就获得了一个基于线程池TaskExecutor。
二、任务执行类
packagecom.cenobitor.taskxecutor.taskservice;
importorg.springframework.scheduling.annotation.Async;
importorg.springframework.stereotype.Service;
@Service
publicclassAsyncTaskService{
@Async
publicvoidexcuteAsyncTask(Integeri){
System.out.println("异步执行任务:"+i);
}
@Async
publicvoidexcuteAsyncTaskPlus(Integeri){
System.out.println("异步执行任务+1:"+(i+1));
}
}
通过@Async注解表明该方法是异步方法,如果注解在类级别,则表明该类所有的方法都是异步方法,而这里的方法自动被注入使用ThreadPoolTaskExecutor作为TaskExecutor。
如果在异步方法所在类中调用异步方法,将会失效;
三、运行
packagecom.cenobitor.taskxecutor;
importcom.cenobitor.taskxecutor.taskservice.AsyncTaskService;
importorg.springframework.context.annotation.AnnotationConfigApplicationContext;
publicclassMain{
publicstaticvoidmain(String[]args){
AnnotationConfigApplicationContextcontext=newAnnotationConfigApplicationContext(TaskxecutorApplication.class);
AsyncTaskServiceasyncTaskService=context.getBean(AsyncTaskService.class);
for(inti=0;i<10;i++){
asyncTaskService.excuteAsyncTask(i);
asyncTaskService.excuteAsyncTaskPlus(i);
}
context.close();
}
}
运行结果:
异步执行任务:0
异步执行任务+1:1
异步执行任务:1
异步执行任务+1:2
异步执行任务:2
异步执行任务:3
异步执行任务:5
异步执行任务+1:6
异步执行任务:6
异步执行任务+1:7
异步执行任务:7
异步执行任务+1:8
异步执行任务:8
异步执行任务+1:9
异步执行任务:9
异步执行任务+1:10
异步执行任务+1:3
异步执行任务:4
异步执行任务+1:5
异步执行任务+1:4
注:摘抄自《JavaEE开发的颠覆者SpringBoot实战》。
以上就是实例讲解springboot多线程的详细内容,更多关于springboot多线程的资料请关注毛票票其它相关文章!