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

    结果:

  • 相关阅读:
    SAP Hybris使用recipe进行安装时,是如何执行ant命令的?
    实时电商数仓(三)之数据采集(二)搭建日志采集系统的集群(二)建立父工程
    实时电商数仓(一)之系统架构
    gdb 条件断点 + 多线程 +attach
    dpdk tx_pkt_burst rte_pktmbuf_free mbuf释放
    dpdk 网卡初始化 —— 收包
    dpdk 版本变动修改
    rte_mempool_get_priv
    mempool + ring test
    dpdk mempool debug
  • 原文地址:https://www.cnblogs.com/tianhengblogs/p/9824271.html
Copyright © 2011-2022 走看看