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

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

相关推荐
广州灵眸科技有限公司18 分钟前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能
库克克30 分钟前
【C++ 】内联函数
java·开发语言·c++
zh_xuan36 分钟前
java 虚拟线程
java·开发语言·虚拟线程
jason成都1 小时前
RTKLIB Java 移植踩坑复盘:卡尔曼滤波核心逻辑修复与滑坡场景实测验证
java·开发语言
老毛肚1 小时前
juc线程通信
java·开发语言·jvm
花颜yyds2 小时前
Java 开发基础速查手册
java
没钥匙的锁13 小时前
05-Java面向对象构造器与封装
java·开发语言
aaPIXa6223 小时前
C++采样引导优化SPGO——比PGO更智能的编译器决策新方案
java·c++·人工智能
蓝银草同学3 小时前
Stream 实战:博客列表排序、过滤与分页(AI 辅助学习 Java 8)
java·前端·后端
某不知名網友4 小时前
C/C++动态内存管理,智能指针及RAlI思想。
java·c语言·c++