APP下载

SpringBoot Spring 使用@Async轻松搞定异步那点事儿

消息来源:baojiabao.com 作者: 发布时间:2026-05-13

报价宝综合消息SpringBoot Spring 使用@Async轻松搞定异步那点事儿

3.2 多执行绪

Spring 通过任务执行器(TaskExecutor)来实现多执行绪和并发程式设计。 使用 ThreadPoolTaskExecutor 可实现一个基于执行绪池的 TaskExecutor。而实际开发中任务一般是非阻碍的, 即异步的,所以我们要在配置类中通过 @EnableAsync 开启对异步任务的支援,并通过在实际执行的 Bean 的方法中 使用 @Async 注解来宣告其是一个异步任务。

/**

* task

*/

@Slf4j

@Service

public class TaskService {

/**

* @Async 注解表明该方法是个异步方法

* 如果注解在类级别,则表明该类的所有方法都是异步方法

* 注意开启 @EnableAsync

* @Async 呼叫中的事务处理机制

* 在 @Async 标注的方法,同时也适用了@Transactional进行了标注;在其呼叫数据库操作之时,将无法产生事务管理的控制,原因就在于其是基于异步处理的操作。

* 那该如何给这些操作新增事务管理呢?可以将需要事务管理操作的方法放置到异步方法内部,在内部被呼叫的方法上新增@Transactional.

* 例如: 方法A,使用了@Async/@Transactional来标注,但是无法产生事务控制的目的。

* 方法B,使用了@Async来标注,B中呼叫了C、D,C/D分别使用@Transactional做了标注,则可实现事务控制的目的。

*/

@Async

public void one() throws InterruptedException {

Thread.sleep(1000);

log.info("-> one");

}

@Async

public void two() throws InterruptedException {

Thread.sleep(3000);

log.info("-> two");

}

@Async

public void three() throws InterruptedException {

Thread.sleep(2000);

log.info("-> three");

}

}

/**

* 配置类

*/

@Configuration

@ComponentScan("chapter3.task")

@EnableAsync

public class TaskConfig implements AsyncConfigurer {

@Override

public Executor getAsyncExecutor() {

ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();

threadPoolTaskExecutor.setCorePoolSize(5);

threadPoolTaskExecutor.setMaxPoolSize(10);

threadPoolTaskExecutor.setQueueCapacity(25);

threadPoolTaskExecutor.initialize();

return threadPoolTaskExecutor;

}

@Override

public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {

return null;

}

}

/**

* 执行类

*/

public class Run {

public static void main(String[] args) throws IOException, InterruptedException {

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TaskConfig.class);

TaskService taskService = context.getBean(TaskService.class);

for (int i=0; i taskService.one();

taskService.two();

taskService.three();

}

context.close();

// 结果是不是按照顺序执行,也就证明任务是异步执行。

// -> one

// -> one

// -> three

// -> one

// -> two

// -> three

// -> two

// -> three

// -> two

}

}

2020-01-23 09:59:00

相关文章