@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注解开启新的子线程

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

相关推荐
小信丶8 分钟前
Spring Cloud Stream EnableBinding注解详解:定义、应用场景与示例代码
java·spring boot·后端·spring
无限进步_12 分钟前
【C++】验证回文字符串:高效算法详解与优化
java·开发语言·c++·git·算法·github·visual studio
亚历克斯神13 分钟前
Spring Cloud 2026 架构演进
java·spring·微服务
七夜zippoe16 分钟前
Spring Cloud与Dubbo架构哲学对决
java·spring cloud·架构·dubbo·配置中心
海派程序猿16 分钟前
Spring Cloud Config拉取配置过慢导致服务启动延迟的优化技巧
java
阿维的博客日记27 分钟前
为什么不逃逸代表不需要锁,JIT会直接删掉锁
java
William Dawson28 分钟前
CAS的底层实现
java
九英里路40 分钟前
cpp容器——string模拟实现
java·前端·数据结构·c++·算法·容器·字符串
YDS82944 分钟前
大营销平台 —— 抽奖前置规则过滤
java·spring boot·ddd
仍然.1 小时前
多线程---CAS,JUC组件和线程安全的集合类
java·开发语言