实例讲解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多线程的资料请关注毛票票其它相关文章!