JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

Springboot 使用@Async开启异步调用

wys521 2024-11-19 12:51:44 精选教程 19 ℃ 0 评论

大家都知道,java是同步顺序执行。当需要异步执行时,需要新创建一个线程完成。
1. 使用常规的方法显示异步调用

第一步 新建 ThreadTest.java 实现 Runnable 接口

@Slf4j
public class ThreadTest implements Runnable{
    @Override
    public void run() {
        log.info("异步任务,线程名称:{}",Thread.currentThread().getName());
    }
}

第二步 新建测试执行

//创建一个线程执行任务类
Thread thread = new Thread(new ThreadTest());
//开启线程
thread.start();

//jdk1.8之后可以使用Lambda 表达式
new Thread(ThreadTest::new).start();

当然,除了这种显式 new Thread 对象,我们通过线程池获取线程名称,这里不做演示。我们熟悉的spring 在 spring3中提供了@Async注解,来方便开发者优雅的使用异步调用。
2.使用 springboot @Async注解,优雅的实现异步调用

第一步 开启 异步调用注解。

@SpringBootApplication
@EnableAsync//开启异步调用
public class Demo3Application {

    public static void main(String[] args) {
        SpringApplication.run(Demo3Application.class, args);
    }

}

第二步 定义线程池

@Configuration
public class AsyncConfig {

    //最大线程数
    private static final int MAX_POOL_SIZE = 50;
    //线程池的基本大小
    private static final int CORE_POOL_SIZE = 20;

    @Bean("asyncTaskExecutor")
    public AsyncTaskExecutor asyncTaskExecutor() {
        ThreadPoolTaskExecutor asyncTaskExecutor = new ThreadPoolTaskExecutor();
        asyncTaskExecutor.setMaxPoolSize(MAX_POOL_SIZE);
        asyncTaskExecutor.setCorePoolSize(CORE_POOL_SIZE);
        asyncTaskExecutor.setThreadNamePrefix("async-task-thread-pool");
        asyncTaskExecutor.initialize();
        return asyncTaskExecutor;
    }

第三步 创建service 测试类 TestService.java

public interface TestService {


    /**
     * 异步调用
     */
    void asyncTask();


}

第四步 新建 Service 实现类 ,TestServiceImpl.java

@Service
@Slf4j
public class TestServiceImpl implements TestService {
    @Override
    @Async(value = "asyncTaskExecutor")
    public void asyncTask() {
        log.info("开始执行业务代码");
        //开始执行时间
        long startTime = System.currentTimeMillis();
        //当前现成延时3000毫秒 模拟耗时
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            log.error("模拟耗时异常:{}", e.getMessage());
        }

        long endTime = System.currentTimeMillis();
        log.info("业务代码执行结束");
        log.info("当前线程名称:{},耗时:{}", Thread.currentThread().getName(), startTime - endTime);
    }
}

第五步 测试执行 ,执行结果

2022-01-22 18:04:39.047  INFO 12159 --- [sk-thread-pool1] c.e.demo.service.impl.TestServiceImpl    : 开始执行业务代码
2022-01-22 18:04:39.047  INFO 12159 --- [sk-thread-pool1] c.e.demo.service.impl.TestServiceImpl    : 业务代码执行结束
2022-01-22 18:04:39.047  INFO 12159 --- [sk-thread-pool1] c.e.demo.service.impl.TestServiceImpl    : 当前线程名称:async-task-thread-pool1,耗时:3001

SpringBoot使用@Async优雅的异步调用就暂时记录到这里,欢迎评论区一起讨论学习。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表