您的位置:首页技术文章
文章详情页

实例讲解spring boot 多线程

【字号: 日期:2023-08-29 14:53:00浏览:12作者:猪猪

Spring 通过任务执行器(TaskExecutor)来实现多线程和并发编程。使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor。而实际开发中任务一般是非阻塞的,即异步的,所有我们在配置类中通过@EnableAsync开启对异步任务的支持,并通过在实际执行的Bean的方法中使用@Async注解来声明其是一个异步任务。

一、配置类

package com.cenobitor.taskxecutor.config;import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.annotation.AsyncConfigurer;import org.springframework.scheduling.annotation.EnableAsync;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;@Configuration@EnableAsyncpublic class TaskExecutorConfig implements AsyncConfigurer { @Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); taskExecutor.setCorePoolSize(5); taskExecutor.setMaxPoolSize(10); taskExecutor.setQueueCapacity(25); taskExecutor.initialize(); return taskExecutor; } @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return null; }}

1、利用@EnableAsync注解开启异步任务支持

2、配置类实现AsyncConfigurer接口并重写getAsyncExecutor方法,并返回一个ThreadPoolTaskExecutor,这样我们就获得了一个基于线程池TaskExecutor。

二、任务执行类

package com.cenobitor.taskxecutor.taskservice;import org.springframework.scheduling.annotation.Async;import org.springframework.stereotype.Service;@Servicepublic class AsyncTaskService { @Async public void excuteAsyncTask(Integer i){ System.out.println('异步执行任务:'+i); } @Async public void excuteAsyncTaskPlus(Integer i){ System.out.println('异步执行任务+1:'+(i+1)); }}

通过@Async注解表明该方法是异步方法,如果注解在类级别,则表明该类所有的方法都是异步方法,而这里的方法自动被注入使用ThreadPoolTaskExecutor作为TaskExecutor。

如果在异步方法所在类中调用异步方法,将会失效;

三、运行

package com.cenobitor.taskxecutor;import com.cenobitor.taskxecutor.taskservice.AsyncTaskService;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Main { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TaskxecutorApplication.class); AsyncTaskService asyncTaskService = context.getBean(AsyncTaskService.class); for (int i = 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 实战》。

以上就是实例讲解spring boot 多线程的详细内容,更多关于spring boot 多线程的资料请关注好吧啦网其它相关文章!

标签: Spring
相关文章: