淘先锋技术网

首页 1 2 3 4 5 6 7

Spring Boot -09 异步任务

基本概念:
多个任务同时执行,类似于多线程的概念
SpringBoot使用注解方式开启异步任务:

步骤
(1)启动类中添加 @EnableAsync 注解,开启异步任务,自动扫描

@SpringBootApplication
@ServletComponentScan
// @EnableAsync注解的作用是开启异步任务
@EnableAsync

public class lication extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(HelloApplication.class);
    }
    public static void main(String[] args) throws Exception {
        SpringApplication.run(lication .class, args);
    }
}

(2)创建异步任务

// @Component注解的作用是实现bean的注入,会被Springboot扫描
@Component
// @Async注解的作用是标识这是一个异步类或方法
@Async
public class Task {
    public void task1(){
        try {
            Thread.sleep(4000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(" 任务:1 ");
    }

    // 任务二:睡眠4秒,并输出一个字符串
    public void task2(){
        try {
            Thread.sleep(4000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("任务:2 ");
    }
}

创建接口

@Autowired
private AsyncTask asyncTask;

@GetMapping("task")
public JsonData testAsync(){
    // 首先拿到系统本身的时间
    long begin = System.currentTimeMillis();
    // 测试三个任务的异步性,根据耗时做测试
    Future<String> task1 =asyncTask.task1();
    Future<String> task2 =asyncTask.task2();
    // 任务四和任务五都完成,则结束执行
    for(;;){
        if(task1.isDone() && task2.isDone()){
            try {
                // get是为了拿到对应的结果
                String task1Result = task1.get();
                System.out.println(task1Result);
                String task2Result = task2.get();
                System.out.println(task2Result);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }finally {
                break;
            }
        }
    }
    // 拿到系统异步方法结束的时间
    long end = System.currentTimeMillis();
    // 返回时间差(结束时间 - 开始时间)
    return JsonData.buildSuccess(end - begin);
}

源码地址:https://download.csdn.net/download/qq_41781775/19148752