博客
关于我
Spring @Async执行异步方法的简单使用
阅读量:795 次
发布时间:2023-02-26

本文共 3449 字,大约阅读时间需要 11 分钟。

Spring @Async 异步方法的简单使用指南

开启Spring的异步处理支持

为了在Spring应用中实现异步方法执行,首先需要配置异步处理支持。可以通过在配置类中添加相应的注解来实现。

@Configuration
@EnableAsync
public class SpringAsyncConfig {
// 配置异步线程池等执行器(如下文所示)
}

@Async注解的使用

@Async注解用于标记需要异步执行的方法。它将切点方法从主线程中脱离,转为异步执行。

@Service
public class UserServiceImpl implements UserService {
@Async
public void printUser(String user) {
log.info(Thread.currentThread().getName() + "---------Looking up " + user);
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info(Thread.currentThread().getName() + "---------user----------------> " + user);
return;
}
@Async
public String getUser0(String user) {
log.info(Thread.currentThread().getName() + "---------Looking up " + user);
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
String result = "hello " + user;
log.info(Thread.currentThread().getName() + "---------user----------------> " + user);
return result;
}
@Async
public CompletableFuture
getUser(String user) {
log.info(Thread.currentThread().getName() + "---------Looking up " + user);
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
String result = "hello " + user;
log.info(Thread.currentThread().getName() + "---------user----------------> " + user);
return CompletableFuture.completedFuture(result);
}
}

调用异步方法

在控制器或服务层调用异步方法后,需等待其完成。可以通过CompletableFuture获取结果,或者在方法返回类型中直接使用异步方法返回结果。

@RestController
public class TestController {
@Autowired
private UserService userService;
@GetMapping("/test")
public String test() {
userService.printUser("Jack");
return Thread.currentThread().getName() + "-----" + "void";
}
@GetMapping("/test2")
public String test2() {
String result = userService.getUser0("Jack");
return Thread.currentThread().getName() + "-----" + result;
}
@GetMapping("/test3")
public String test3() throws Exception {
CompletableFuture
result = userService.getUser("Jack");
String user = result.get();
return Thread.currentThread().getName() + "-----" + user;
}
}

配置自定义异步执行器

你也可以配置自定义的线程池来执行异步任务。在Spring配置类中添加相应的bean配置。

@Configuration
@EnableAsync
public class SpringAsyncConfig {
@Bean("taskExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(20);
executor.setQueueCapacity(200);
executor.setKeepAliveSeconds(60);
executor.setThreadNamePrefix("taskExecutor-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(60);
return executor;
}
}

@Async注解不生效的原因

如果@Async注解没有生效,可能是以下原因之一:

  • SpringBootApplication启动类未添加@EnableAsync注解:确保主类被正确注解,启用异步支持。

  • 异步方法返回值不是void或Future:@Async注解仅作用于返回void或Future类型的方法。

  • 方法不是public方法:确保方法是public的,否则无法被Spring代理。

  • 解决方法

  • 确保@Async注解的方法是public方法。

  • 从外部类调用方法,类内调用无效。

  • 如果需要内部调用,通过@Autowired获取服务bean后调用。

  • 总结

    通过上述配置和使用方法,你可以轻松实现Spring中的异步方法执行。配置@Async注解和自定义线程池后,就可以高效处理I/O密集型任务,提升应用性能。

    转载地址:http://fxvfk.baihongyu.com/

    你可能感兴趣的文章
    OSG学习:场景图形管理(三)——多视图相机渲染
    查看>>
    OSG学习:场景图形管理(二)——单窗口多相机渲染
    查看>>
    OSG学习:场景图形管理(四)——多视图多窗口渲染
    查看>>
    OSG学习:新建C++/CLI工程并读取模型(C++/CLI)——根据OSG官方示例代码初步理解其方法
    查看>>
    Sql 随机更新一条数据返回更新数据的ID编号
    查看>>
    OSG学习:空间变换节点和开关节点示例
    查看>>
    OSG学习:纹理映射(一)——多重纹理映射
    查看>>
    OSG学习:纹理映射(七)——聚光灯
    查看>>
    OSG学习:纹理映射(三)——立方图纹理映射
    查看>>
    OSG学习:纹理映射(二)——一维/二维/简单立方图纹理映射
    查看>>
    OSG学习:纹理映射(五)——计算纹理坐标
    查看>>
    OSG学习:纹理映射(六)——灯光
    查看>>
    OSG学习:纹理映射(四)——三维纹理映射
    查看>>
    OSG:从源码看Viewer::run() 一
    查看>>
    OSI七层模型与TCP/IP四层与五层模型详解
    查看>>
    OSI七层模型的TCP/IP模型都有哪几层和他们的对应关系?
    查看>>
    OSM数据如何下载使用(地图数据篇.11)
    查看>>
    OSPF 四种设备角色:IR、ABR、BR、ASBR
    查看>>
    OSPF 学习
    查看>>
    OSPF 概念型问题
    查看>>