zoukankan      html  css  js  c++  java
  • SpringBoot------异步任务的使用

    步骤,如图所示:

    1.添加异步任务业务类

    package top.ytheng.demo.task;
    
    import java.util.concurrent.Future;
    
    import org.springframework.scheduling.annotation.Async;
    import org.springframework.scheduling.annotation.AsyncResult;
    import org.springframework.stereotype.Component;
    
    //异步任务业务类
    @Component
    //标记此类是异步类,也可在方法中标记
    //不加,则类里面的方法为同步执行
    @Async
    public class AsyncTask {
    
        public void task1() throws InterruptedException {
            long begin = System.currentTimeMillis();
            Thread.sleep(1000);
            long end = System.currentTimeMillis();
            System.out.println("任务1耗时:" + (end - begin));
        }
        
        public void task2() throws InterruptedException {
            long begin = System.currentTimeMillis();
            Thread.sleep(2000);
            long end = System.currentTimeMillis();
            System.out.println("任务2耗时:" + (end - begin));
        }
        
        public void task3() throws InterruptedException {
            long begin = System.currentTimeMillis();
            Thread.sleep(3000);
            long end = System.currentTimeMillis();
            System.out.println("任务3耗时:" + (end - begin));
        }
        
        //测试拿到返回结果
        public Future<String> task4() throws InterruptedException {
            long begin = System.currentTimeMillis();
            Thread.sleep(1000);
            long end = System.currentTimeMillis();
            System.out.println("任务4耗时:" + (end - begin));
            return new AsyncResult<String>("任务4");
        }
        
        public Future<String> task5() throws InterruptedException {
            long begin = System.currentTimeMillis();
            Thread.sleep(2000);
            long end = System.currentTimeMillis();
            System.out.println("任务5耗时:" + (end - begin));
            return new AsyncResult<String>("任务5");
        }
        
        public Future<String> task6() throws InterruptedException {
            long begin = System.currentTimeMillis();
            Thread.sleep(3000);
            long end = System.currentTimeMillis();
            System.out.println("任务6耗时:" + (end - begin));
            return new AsyncResult<String>("任务6");
        }
    }

    2.添加测试控制器

    package top.ytheng.demo.controller;
    
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.Future;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import top.ytheng.demo.task.AsyncTask;
    
    @RestController
    @RequestMapping("api/v1/async")
    public class TaskController {
    
        @Autowired
        private AsyncTask asyncTask;
        
        @GetMapping("/test")
        public Object test() throws InterruptedException, ExecutionException {
            long begin = System.currentTimeMillis();
            //asyncTask.task1();
            //asyncTask.task2();
            //asyncTask.task3();
            Future<String> result1 = asyncTask.task4();
            Future<String> result2 = asyncTask.task5();
            Future<String> result3 = asyncTask.task6();
            System.out.println("返回结果:" + result1.get() + "," + result2.get() + "," + result3.get());
            for(;;) {
                if(result1.isDone() && result2.isDone() && result3.isDone()) {
                    break;
                }
            }
            long end = System.currentTimeMillis();
            long total = end - begin;
            System.out.println("总耗时:" + total);
            return "总耗时:" + total;
        }
    }

    3.添加启动类

    package top.ytheng.demo;
    
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.scheduling.annotation.EnableAsync;
    import org.springframework.scheduling.annotation.EnableScheduling;
    
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.web.servlet.ServletComponentScan;
    
    @SpringBootApplication //等于下面3个
    //@SpringBootConfiguration
    //@EnableAutoConfiguration
    //@ComponentScan
    //拦截器用到
    @ServletComponentScan
    //MyBatis用到
    @MapperScan("top.ytheng.demo.mapper")
    //定时使用(开启定时任务)
    @EnableScheduling
    //开启异步任务
    @EnableAsync
    public class DemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    }

    4.右键项目Run As启动,访问url

    http://localhost:8080/api/v1/async/test

    结果:

  • 相关阅读:
    vs编译错误error C2059 由extern "C"导致的错误处理
    原生JS:响应式轮播图
    JSP用户关注取关实现
    JSP和AJAX实现登录注册
    MySQL常用命令
    offsetWidth/getBoundingRect()/scrollWidth/client用法总结
    画廊相册—原生JavaScript实现
    《JavaScript DOM 编程艺术》读书笔记
    天猫网页前端实现
    Docker安装和配置(链接集合)
  • 原文地址:https://www.cnblogs.com/tianhengblogs/p/9824271.html
Copyright © 2011-2022 走看看