Spring Boot使用 @Async 注解进行异步调用

Spring Boot使用 @Async 注解进行异步调用

创建异步调用线程池配置代码:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

@Configuration
@EnableAsync // 启用异步调用
public class AsyncConfig implements AsyncConfigurer {


    @Bean("taskExecutor")
    public Executor getCutChartExecutor() {
        //线程池
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(3);
        taskExecutor.setMaxPoolSize(10);
        taskExecutor.setQueueCapacity(100);
        taskExecutor.setKeepAliveSeconds(60);
        taskExecutor.setThreadNamePrefix("async-task-thread-pool");
        //rejection-policy:当pool已经达到max size的时候,如何处理新任务
        //CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行
        //对拒绝task的处理策略
        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        taskExecutor.initialize();
        return taskExecutor;
    }

}

创建异步调用方法:

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class AsyncExecutor {

    @Async("taskExecutor")
    public void execute(Runnable runnable){
        try {
            Thread thread = Thread.currentThread();
            log.info("当前异步线程:{}", thread.getName());
            runnable.run();
        } catch (Exception e) {
            log.error("AsyncExecutor execute执行异常",e);
        }
    }
}

调用异步方法:

    @RequestMapping("/async")
    public Future<String> async() {
        System.out.println("start");
        asyncExecutor.execute(() -> {
            System.out.println("async start");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("async end");
        });
        System.out.println("end");
        return new AsyncResult<>("我是返回值");
    }

执行结果:

 

posted @ 2021-07-12 14:07  唐胜伟  阅读(97)  评论(0编辑  收藏  举报