ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

springBoot异步执行方法@Async

2019-07-01 17:25:35  阅读:257  来源: 互联网

标签:异步 springBoot System long currentTimeMillis currentTimeMillis1 Async public


        我们在使用多线程的时候,往往需要创建Thread类,或者实现Runnable接口,如果要使用到线程池,我们还需要创建Exectors。而在Spring中只要@EnableAsync就可以开启多线程,使用@Async就可以定义一个线程任务。

1、什么是异步调用

        异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步程序执行完即可执行。

2、如何实现异步调用

    多线程,这是很多人第一眼想到的关键词,没错,多线程就是一种实现异步调用的方式。
    在非spring目项目中我们要实现异步调用的就是使用多线程方式,可以自己实现Runable接口或者集成Thread类,或者使用jdk1.5以上提供了的Executors线程池。

3、springBoot异步执行方法@Async

        首先创建一个普通的SpringBoot Web工程,添加web依赖即可。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        开启异步,@EnableAsync  注解主要是为了扫描范围包下的所有 @Async注解

@EnableAsync
@SpringBootApplication
public class EhCacheStudyApplication {

    public static void main(String[] args) {

        SpringApplication.run(EhCacheStudyApplication.class, args);
    }

}

        创建异步任务,异步任务类代码:

@Component
public class MyAsyncTask {

    @Async
    public void task1() throws InterruptedException {
        long currentTimeMillis = System.currentTimeMillis();
        Thread.sleep(1000);
        long currentTimeMillis1 = System.currentTimeMillis();
        System.out.println("task1任务耗时:" + (currentTimeMillis1 - currentTimeMillis));
    }

    @Async
    public void task2() throws InterruptedException {
        long currentTimeMillis = System.currentTimeMillis();
        Thread.sleep(2000);
        long currentTimeMillis1 = System.currentTimeMillis();
        System.out.println("task2任务耗时:" + (currentTimeMillis1 - currentTimeMillis));
    }

    @Async
    public void task3() throws InterruptedException {
        long currentTimeMillis = System.currentTimeMillis();
        Thread.sleep(1000);
        long currentTimeMillis1 = System.currentTimeMillis();
        System.out.println("task3任务耗时:" + (currentTimeMillis1 - currentTimeMillis));
    }
}
@RestController
public class AsyncTaskController {

    @Autowired
    private MyAsyncTask myAsyncTask;

    @RequestMapping
    public String doTask() throws InterruptedException {
        long currentTimeMillis = System.currentTimeMillis();
        myAsyncTask.task1();
        myAsyncTask.task2();
        myAsyncTask.task3();
        long currentTimeMillis1 = System.currentTimeMillis();
        System.out.println("task任务总耗时:" + (currentTimeMillis1 -currentTimeMillis));

        return "task任务总耗时:" + (currentTimeMillis1 -currentTimeMillis);
    }
}

        启动项目,访问接口,查看后台输出结果:

4、采用Future来查看异步任务执行完毕和执行的结果

        创建异步执行任务,异步代码块:

@Component
public class FutureAsyncTask {

    @Async
    public Future<String> task1() throws InterruptedException {
        long currentTimeMillis = System.currentTimeMillis();
        Thread.sleep(1000);
        long currentTimeMillis1 = System.currentTimeMillis();
        System.out.println("task1任务耗时:" + (currentTimeMillis1 - currentTimeMillis));
        return new AsyncResult<>("task1执行完毕!");
    }

    @Async
    public Future<String> task2() throws InterruptedException {
        long currentTimeMillis = System.currentTimeMillis();
        Thread.sleep(2000);
        long currentTimeMillis1 = System.currentTimeMillis();
        System.out.println("task2任务耗时:" + (currentTimeMillis1 - currentTimeMillis));
        return new AsyncResult<>("task2执行完毕!");
    }

    @Async
    public Future<String> task3() throws InterruptedException {
        long currentTimeMillis = System.currentTimeMillis();
        Thread.sleep(1000);
        long currentTimeMillis1 = System.currentTimeMillis();
        System.out.println("task3任务耗时:" + (currentTimeMillis1 - currentTimeMillis));
        return new AsyncResult<>("task3执行完毕!");
    }
}

   

@RestController
@RequestMapping
public class FutureAsyncController {

    @Autowired
    private FutureAsyncTask futureAsyncTask;

    @RequestMapping("future/async")
    public String doTask() throws InterruptedException {
        long currentTimeMillis = System.currentTimeMillis();

        Future<String> task1 = futureAsyncTask.task1();
        Future<String> task2 = futureAsyncTask.task2();
        Future<String> task3 = futureAsyncTask.task3();

        while (true) {
            if(task1.isDone() && task2.isDone() && task3.isDone())
                break;
        }

        long currentTimeMillis1 = System.currentTimeMillis();
        System.out.println("task任务总耗时:" + (currentTimeMillis1 -currentTimeMillis));
        return "task任务总耗时:" + (currentTimeMillis1 -currentTimeMillis);
    }
}

        启动项目,访问接口,查看后台输出结果:

 

 

标签:异步,springBoot,System,long,currentTimeMillis,currentTimeMillis1,Async,public
来源: https://blog.csdn.net/m0_37732829/article/details/94394450

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有