170719、springboot编程之异步调用@Async

1、在pom.xml中增加依赖

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

2、在主类上开启注解

package com.rick;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

@SpringBootApplication
@EnableAsync
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

3、新建任务测试类

package com.rick.task;

import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Component;

import java.util.Random;
import java.util.concurrent.Future;

/**
 * Desc :  任务类
 * User : RICK
 * Time : 2017/8/29 9:56
  */

@Component
public class Task1 {

    public Random random = new Random();

    /**
     * Desc :  @Async所修饰的函数不要定义为static类型,否则异步调用不会生效
     *  这里通过返回Future<T>来返回异步调用的结果,实现异步回调
     * User : RICK
     * Time : 2017/8/29 10:30
      */

    //任务一
    @Async
    public Future<String> doTaskOne() throws Exception{
        System.out.println("开始做任务一");
        long start = System.currentTimeMillis();
        Thread.sleep(random.nextInt(10000));
        long end = System.currentTimeMillis();
        System.out.println("完成任务一,耗时:" + (end - start) + "毫秒");
        return new AsyncResult<>("test1 is done!");
    }

    //任务二;
    @Async
    public Future<String> doTaskTwo() throws Exception {
        System.out.println("开始做任务二");
        long start = System.currentTimeMillis();
        Thread.sleep(random.nextInt(10000));
        long end = System.currentTimeMillis();
        System.out.println("完成任务二,耗时:" + (end - start) + "毫秒");
        return new AsyncResult<>("test2 is done!");
    }

    //任务3;
    @Async
    public Future<String> doTaskThree() throws Exception {
        System.out.println("开始做任务三");
        long start = System.currentTimeMillis();
        Thread.sleep(random.nextInt(10000));
        long end = System.currentTimeMillis();
        System.out.println("完成任务三,耗时:" + (end - start) + "毫秒");
        return new AsyncResult<>("test3 is done!");
    }

}

4、创建测试控制器

package com.rick.controller;

import com.rick.task.Task1;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.Future;

@RestController
public class TaskController {

    @Autowired
    private Task1 task1;

    @RequestMapping("/task1")
    public String task1() throws  Exception{
        Future<String> test1 = task1.doTaskOne();
        Future<String> test2 = task1.doTaskTwo();
        Future<String> test3 = task1.doTaskThree();

        while (true){
            if(test1.isDone()){
                System.out.println("====================test1 is done=========================");
            }

            if(test2.isDone()){
                System.out.println("====================test2 is done=========================");
            }

            if(test3.isDone()){
                System.out.println("====================test3 is done=========================");
            }

            if(test1.isDone() && test2.isDone() && test3.isDone()){
                break;
            }
            Thread.sleep(1000);
        }

        return "task1";
    }

}

5、启动项目测试http://localhost:8080/task1

项目代码:https://github.com/zrbfree/spring-boot-async.git

时间: 2024-11-06 03:29:07

170719、springboot编程之异步调用@Async的相关文章

springboot 异步调用Async使用方法

引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3.x之后,就已经内置了@Async来完美解决这个问题,本文将介绍在springboot中如何使用@Async. 1.pom.xml中导入必要的依赖: <parent> <groupId>org.springframework.boot</groupId> <artifa

SpringBoot系列:Spring Boot异步调用@Async

在实际开发中,有时候为了及时处理请求和进行响应,我们可能会多任务同时执行,或者先处理主任务,也就是异步调用,异步调用的实现有很多,例如多线程.定时任务.消息队列等, 这一章节,我们就来讲讲@Async异步方法调用. 一.@Async使用演示 @Async是Spring内置注解,用来处理异步任务,在SpringBoot中同样适用,且在SpringBoot项目中,除了boot本身的starter外,不需要额外引入依赖. 而要使用@Async,需要在启动类上加上@EnableAsync主动声明来开启异

nodejs异步调用async

犹豫nodejs是异步编程模型,有一些在同步编程中很容易做到的事情,现在却变得很麻烦,async的流程控制就是为了简化这些操作var async = require('async'); 1.series(多个函数一次执行,之间没有数据交换)series(tasks,[callback])顺序执行数组.集合内的函数,当前面一个函数执行完成就会立即执行下一个函数,如果函数触发了错误,可以在callback函数中验证,否则会一直执行完成tasks有多个异步函数需要依次调用,一个完成之后才能执行下一个,

springBoot定时任务和异步调用

springboot定时任务 在创建好的springboot项目的启动类上加@EnableScheduling注解. @EnableScheduling @SpringBootApplication @MapperScan("com.qianlong.dao") @ComponentScan(value = "com.qianlong") public class DemoApplication { public static void main(String[]

异步调用 async

基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小. 在 consumer.xml 中配置: <dubbo:reference id="fooService" interface="com.alibaba.foo.FooService"> <dubbo:method name="findFoo" async="true" /> </dubbo

SpringBoot中异步请求和异步调用(看这一篇就够了)

一.SpringBoot中异步请求的使用 1.异步请求与同步请求 特点: 可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在耗时处理完成(例如长时间的运算)时再对客户端进行响应.一句话:增加了服务器对客户端请求的吞吐量(实际生产上我们用的比较少,如果并发请求量很大的情况下,我们会通过nginx把请求负载到集群服务的各个节点上来分摊请求压力,当然还可以通过消息队列来做请求的缓冲). 2.异步请求的实现 方式一:Servlet方式实现异步请求

浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法(转载)

在调用一个jquery的ajax方法时我们有时会需要该方法返回一个值或者给某个全局变量赋值,可是我们发现程序执行完后并没有获取到我们想要的值,这时很有可能是因为你用的是ajax的异步调用async:true(默认情况),如: 复制代码 代码如下: function ManageCommentText(text) {var result = text;$.ajax({data: "get",url: "GetComments.aspx",data: "typ

jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法

jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法 在调用一个jquery的ajax方法时我们有时会需要该方法返回一个值或者给某个全局变量赋值,可是我们发现程序执行完后并没有获取到我们想要的值,这时很有可能是因为你用的是ajax的异步调用async:true(默认情况),如: function ManageCommentText(text) { var result = text; $.ajax({ data: "get", url: &qu

SpringBoot系列——@Async优雅的异步调用

前言 众所周知,java的代码是同步顺序执行,当我们需要执行异步操作时我们需要创建一个新线程去执行,以往我们是这样操作的: /** * 任务类 */ class Task implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName() + ":异步任务"); } } //新建线程并执行任务类 new Thread(new Task()).sta