SpringBoot-注解:@Async 使用

不同类中使用@Async

线程配置初始化类-ThreadPoolConfig

package com.zzdy.recharge.config;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.scheduling.annotation.EnableAsync;

import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

/**

* 线程池配置

*/

@Configuration
@EnableAsync(proxyTargetClass = true)

public class ThreadPoolConfig {

private final int core = Runtime.getRuntime().availableProcessors() + 1;

/**

*

* @return

*/
@Bean(name = "rechargeMorenTaskExecutor")

public ThreadPoolTaskExecutor threadPoolTaskExecutor() {

ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

// 设置核心线程数

executor.setCorePoolSize(core);

// 设置最大线程数

executor.setMaxPoolSize(core * 2);

// 设置队列容量

executor.setQueueCapacity(128);

// 空闲时间

executor.setKeepAliveSeconds(300);

// 设置线程名称前缀

executor.setThreadNamePrefix("recharge-moren-thread-");

executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

// 执行初始化
executor.initialize();

return executor;

}

}

调用线程类

@Slf4j

@Service

public class DataAnalysisService{

@Async("rechargeMorenTaskExecutor")

public ReturnData dataAnalysisService(String body){

System.out.println(Thread.currentThread());

}

}

同一个类中调用需要先获取代理对象,也就是手动获取对象

复制代码
@Service
@EnableAsync
public class DemoService {
    public void add(){
        DemoService bean = SpringUtil.getBean(DemoService.class);
        System.out.println("开始o");
        bean.sendToKafka();
        System.out.println("结束o");
    }
    @Async
    public void sendToKafka() {
        try {
            Thread.sleep(10000);
            System.out.println(" 醒了!!! ");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

总结

1、在需要用到的@Async注解的类上加上@EnableAsync,或者直接加在springboot启动类上

2、异步处理方法(也就是加了@Async注解的方法)只能返回的是void或者Future类型

3、同一个类中调用异步方法需要先获取代理类,因为@Async注解是基于Spring AOP (面向切面编程)的,而AOP的实现是基于动态代理模式实现的。有可能因为调用方法的是对象本身而不是代理对象,因为没有经过Spring容器。。。。。。这点很重要,也是经常遇到的

相关推荐
橘子星几秒前
前端薅数据神器 Fetch:不用翻墙,在线拿捏后端与 AI 接口
前端·后端
未若君雅裁8 分钟前
死锁产生条件与诊断:jps、jstack、VisualVM
java·开发语言
再玩一会儿看代码8 分钟前
Java抽象类和接口区别_场景理解
java·开发语言·经验分享·笔记·python
用户9258079114810 分钟前
画图理解mysql日志机制
java·后端
huzhongqiang11 分钟前
120行代码实现一个极简 Agent
后端·agent
XIAOHEZIcode11 分钟前
进程、会话与终端——一次真实的 Linux Session 解剖
linux·后端·命令行
javahongxi12 分钟前
Spring Cloud Trace 链路实现
java·spring boot·spring cloud
枕星而眠13 分钟前
【数据结构】树与二叉树基础知识点总结
数据结构·c++·后端·算法·运维开发
海梨花14 分钟前
腾讯面试高频算法题
java·算法·面试
于先生吖15 分钟前
Java消息队列优化抢单逻辑,同城搬家拉货多场景业务数据库架构设计
java·开发语言·数据库架构