springboot使用@Async异步(简易)

发布时间 2023-07-18 14:32:20作者: 五官一体即忢

实际项目中, 使用@Async调用线程池,推荐使用自定义线程池的模式,不推荐直接使用@Async直接实现异步,直接使用会不断的创建线程,最终会导致系统占用内存过高。

1、自定义线程池


package com.sxsoft.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.Executor;

/**
* @program: sxsoft_operation_admin
* @ClassName TaskPoolConfig
* @description:
* 自定义线程池,线程池参数配置,多个线程池实现线程池隔离,@Async注解,默认使用系统自定义线程池,可在项目中设置多个线程池,
* 在异步调用的时候,指明需要调用的线程池名称,比如:@Async("taskName")
* @author: ht
* @create: 2023-07-18 14:00
* @Version 1.0
**/
@EnableAsync
@Configuration
public class TaskPoolConfig {

@Bean("taskExecutor")
public Executor taskExecutor() {
//返回可用处理器的Java虚拟机的数量 12
int i = Runtime.getRuntime().availableProcessors();
System.out.println("系统最大线程数 :" + i);
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//核心线程池大小
executor.setCorePoolSize(16);
//最大线程数
executor.setMaxPoolSize(20);
//配置队列容量,默认值为Integer.MAX_VALUE
executor.setQueueCapacity(99999);
//活跃时间
executor.setKeepAliveSeconds(60);
//线程名字前缀
executor.setThreadNamePrefix("asyncServiceExecutor-");
//设置此执行程序应该在关闭时阻止的最大秒数,以便在容器的其余部分继续关闭之前等待剩余的任务完成他们的执行
executor.setAwaitTerminationSeconds(60);
//等待所有的任务结束后再关闭线程池
executor.setWaitForTasksToCompleteOnShutdown(true);
return executor;
}
}
 

 2、service层使用

public interface AsyncService {
 
    MessageResult sendSms(String callPrefix, String mobile, String actionType, String content);
 
    MessageResult sendEmail(String email, String subject, String content);
}
 
@Slf4j
@Service
public class AsyncServiceImpl implements AsyncService {
 
    @Autowired
    private IMessageHandler mesageHandler;
 
    @Override
    @Async("taskExecutor")
    public MessageResult sendSms(String callPrefix, String mobile, String actionType, String content) {
        try {
 
            Thread.sleep(1000);
            mesageHandler.sendSms(callPrefix, mobile, actionType, content);
 
        } catch (Exception e) {
            log.error("发送短信异常 -> ", e)
        }
    }
    
    @Override
    @Async("taskExecutor")
    public sendEmail(String email, String subject, String content) {
        try {
 
            Thread.sleep(1000);
            mesageHandler.sendsendEmail(email, subject, content);
 
        } catch (Exception e) {
            log.error("发送email异常 -> ", e)
        }
    }
}