Spring Boot中开启异步任务,并使用回调函数处理异步任务的结果
创始人
2025-05-31 11:47:27

一、在spring boot中使用Async,来实现异步任务

在Spring Boot中,可以使用@Autowired注解将一个类的实例注入到另一个类中,并使用@Async注解来开启一个新的线程来运行该类的方法。下面是一个简单的示例:

1、添加Async的配置文件

在使用@Async注解之前,需要在Spring Boot的配置文件中开启异步支持:

spring:task:execution:pool:core-size: 10max-size: 20

上面的配置会创建一个大小为10的线程池,最大线程数为20。这样,当我们调用doSomething方法时,它会在一个新的线程中执行。

在启动类中添加启用异步任务的注解
@EnableAsync

2、创建异步任务

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;@Component
public class MyService {@Asyncpublic void doSomething(String param) {// 在新线程中执行的代码System.out.println("Received parameter: " + param);}
}

在上面的示例中,MyService类的doSomething()方法使用了@Async注解,表明该方法将在一个新的线程中执行。该方法接收一个字符串参数,并在新线程中输出该参数的值。

3、调用异步任务

现在,假设有另一个类需要传递参数给MyService类,并开启一个新的线程来执行doSomething()方法。可以在该类中使用@Autowired注解来注入MyService类的实例,并直接调用doSomething()方法,如下所示:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class AnotherClass {@Autowiredprivate MyService myService;public void runInNewThread(String param) {new Thread(() -> {myService.doSomething(param);}).start();}
}

在上面的示例中,AnotherClass类中的runInNewThread()方法接收一个字符串参数,并在新线程中调用MyService类的doSomething()方法,将该参数传递给它。要注意的是,AnotherClass类需要使用@Component注解标记为一个Spring组件,以便Spring容器可以扫描和管理它。

二、使用回调函数,处理异步任务的结果

使用异步编程有一个问题,就是异步操作完成后,如何处理它的结果呢?这时候可以使用回调函数来处理异步结果。

在Spring Boot中,可以使用CompletableFuture来处理异步结果。CompletableFuture是一个异步编程的工具类,可以让我们更方便地处理异步结果。

下面是一个使用CompletableFuture来处理异步结果的例子:

@Service
public class SomeService {@Asyncpublic CompletableFuture longRunningMethod() {// 耗时操作int result = 100;return CompletableFuture.completedFuture(result);}}@Service
public class AnotherService {@Autowiredprivate SomeService someService;public void doSomething() {CompletableFuture future = someService.longRunningMethod();future.thenAccept(result -> {// 处理异步结果System.out.println("异步结果:" + result);});}}

上面的代码中,longRunningMethod方法返回一个CompletableFuture对象,表示异步结果。在doSomething方法中,我们调用longRunningMethod方法,并使用thenAccept方法注册一个回调函数,当异步结果完成后,回调函数会被执行。

回调函数的参数result表示异步结果,我们可以在回调函数中对结果进行处理,比如输出结果到控制台。

相关内容

热门资讯

分享实测“新道游透视挂辅助”(... 您好:新道游这款游戏可以开挂,确实是有挂的,需要软件加微信【5902455】,很多玩家在新道游这款游...
重磅推荐“微乐宁夏麻将有没有挂... 重磅推荐“微乐宁夏麻将有没有挂”[必胜开挂神器]您好:微乐宁夏麻将这款游戏可以开挂,确实是有挂的,需...
重大发现“八闽掌上麻将 有没有... 您好:八闽掌上麻将这款游戏可以开挂,确实是有挂的,需要软件加微信【2278274】,很多玩家在八闽掌...
(重磅.揭秘)“咪咪扑克究竟有... 亲:无需打开直接搜索微信【2832208】本司针对手游进行,选择我们的四大理由:咪咪扑克这款游戏其实...
科普.常识" 科米台... 科普.常识"科米台州麻将究竟是不是有挂"[(确实是有挂)]您好:科米台州麻将这款游戏可以开挂,确实是...