@Async注解的坑

问题描述

一个方法调用另一个方法(该方法使用@Async注解)在同一个类文件中,该注解会失效!

问题复现

TestAsyncController 类
java 复制代码
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestAsyncController {

    private static final Logger logger = LoggerFactory.getLogger(TestAsyncController.class);

    @PostMapping("/test")
    public void test() {
        logger.info("测试异步开始...");
        try {
            test1();
        } catch (Exception e) {
            e.printStackTrace();
        }
        logger.info("测试异步结束...");
    }

    @Async
    public void test1(){
        for(int i=0;i<5;i++){
            logger.info("i={}",i);
        }
    }
}
问题测试结果

可以看出是全部使用的主线程

问题解决

将@Async注解的方法放在一个新的类文件中即可

TestAsyncService类
java 复制代码
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class TestAsyncService {

    private static final Logger logger = LoggerFactory.getLogger(TestAsyncService.class);

    @Async
    public void test1(){
        for(int i=0;i<5;i++){
            logger.info("i={}",i);
        }
    }
}
TestAsyncController类
java 复制代码
import com.example.demo.service.TestAsyncService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestAsyncController {

    private static final Logger logger = LoggerFactory.getLogger(TestAsyncController.class);

    @Autowired
    private TestAsyncService asyncService;

    @PostMapping("/test")
    public void test() {
        logger.info("测试异步开始...");
        try {
            asyncService.test1();
        } catch (Exception e) {
            e.printStackTrace();
        }
        logger.info("测试异步结束...");
    }
}

测试结果

可以看出@Async注解开启新的子线程

问题原因需要各位大佬们帮忙解答!

相关推荐
10km15 分钟前
java:Apache Commons Configuration2占位符解析异常的正确解法:${prefix:name:-default}
java·apache·configuration2·变量插值·interpolation
customer0815 分钟前
【开源免费】基于SpringBoot+Vue.JS个人博客系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
灰色人生qwer23 分钟前
SpringBoot 项目配置日志输出
java·spring boot·后端
2301_7930698233 分钟前
Spring Boot +SQL项目优化策略,GraphQL和SQL 区别,Spring JDBC 等原理辨析(万字长文+代码)
java·数据库·spring boot·sql·jdbc·orm
阿华的代码王国39 分钟前
【从0做项目】Java搜索引擎(6)& 正则表达式鲨疯了&优化正文解析
java·后端·搜索引擎·正则表达式·java项目·从0到1做项目
服务端相声演员39 分钟前
Oracle JDK、Open JDK zulu下载地址
java·开发语言
是姜姜啊!40 分钟前
java连接redis
java·redis
hhw19911242 分钟前
spring boot知识点5
java·数据库·spring boot
EQUINOX144 分钟前
lab4 CSAPP:Cachelab
java·后端·spring
customer081 小时前
【开源免费】基于SpringBoot+Vue.JS打卡健康评测系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源