SpringBoot 处理异步调用的示例

Springboot中集成了@Async注解,我们在使用的时候直接用就好了.

 

 

不需要获取到返回值

如果只是单纯的让线程去异步执行,不需要返回结果的话,如下示例,直接进行..单线程进行的话,至少需要4+3+2=9秒钟,而我们不考虑运行的结果,只是让他去运行的话,那么肯定在他们执行之前执行完成,

 

后来打印了一下时间,好像就用了4ms.所以,多线程异步还是挺6的....

 

package com.trs.idap.service;

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

/**
 * Created by Administrator on 2018/10/11.
 * 描述:
 *
 * @author Young
 * @create 2018-10-11 19:48
 */
@Component
@Async
public class TestAsyncService {

    @Async
    public void execAsync1(){
        try{
            Thread.sleep(2000);
            System.out.println("甲睡了2000ms");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    @Async
    public void execAsync2(){
        try{
            Thread.sleep(4000);
            System.out.println("乙睡了4000ms");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    @Async
    public void execAsync3(){
        try{
            Thread.sleep(3000);
            System.out.println("丙睡了3000ms");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

 

package com.trs.idap.web.rest.controller;

import com.trs.idap.service.TestAsyncService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by Administrator on 2018/10/11.
 * 描述:
 * @author Young
 * @create 2018-10-11 19:46
 */
@RequestMapping("/api")
@RestController
public class TestAsync {

    @Autowired
    private TestAsyncService testAsyncService;


    @RequestMapping("execAsync")
    public void execAsync(){
        testAsyncService.execAsync1();//2s
        testAsyncService.execAsync2();//4s
        testAsyncService.execAsync3();//3s
        System.out.println("我执行结束了");
    }
}

 

 

 

需要返回值

需要返回值的情况也差不多,可以理解为,一次性把任务分发出去.然后任务各自去执行,这时分发任务后可以返回一个Future,我们可以理解为在饭店做饭给的小票,等饭好了凭小票去拿饭...

 

等我们做完其他的事情的时候,再来收集这些返回值.通过Future的get()方法,如果该Future对应的方法还没有执行完,或者没有结果,此时get()会阻塞在这里,直到拿到结果值为止....

Futurn还有一个isDone()方法,只是判断该Future对应的任务有没有执行完成,和get()大同小异了..看你是想拿到结果,还是想看任务是否执行成功.

 

所以,我们看下,单线程同步的话,至少需要9s+其他处理时间,而现在是最大任务的时间+其他处理时间.此时很明显的看清楚,9s(所有任务的时间和)是远远比最大任务时间要多的多....所以这就是效率....也刚起步,慢慢积累,接收批评.

 

package com.trs.idap.web.rest.controller;

import com.trs.idap.service.TestAsyncService;
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.ExecutionException;
import java.util.concurrent.Future;

/**
 * Created by Administrator on 2018/10/11.
 * 描述:
 * @author Young
 * @create 2018-10-11 19:46
 */
@RequestMapping("/api")
@RestController
public class TestAsync {

    @Autowired
    private TestAsyncService testAsyncService;


    @RequestMapping("execAsync")
    public void execAsync() throws ExecutionException, InterruptedException {
        long l = System.currentTimeMillis();
        Future<String> stringFuture = testAsyncService.execAsync1();//2s
        Future<String> stringFuture1 = testAsyncService.execAsync2();//4s
        Future<String> stringFuture2 = testAsyncService.execAsync3();//3s
        //此时这里的get方法调用了线程的阻塞,可以不用isDone进行判断.
        //如果Future还没有值,线程是阻塞的,直到获取到值时结束
        String s = stringFuture.get();
        String s1 = stringFuture1.get();
        String s2 = stringFuture2.get();
        System.out.println("执行结束....."+s+s1+s2);
        System.out.println("我执行结束了:"+(System.currentTimeMillis()-l));
    }
}
package com.trs.idap.service;

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

import java.util.concurrent.Future;

/**
 * Created by Administrator on 2018/10/11.
 * 描述:
 *
 * @author Young
 * @create 2018-10-11 19:48
 */
@Component
@Async
public class TestAsyncService {

    @Async
    public Future<String> execAsync1(){
        try{
            Thread.sleep(2000);
            System.out.println("甲睡了2000ms");
            return new AsyncResult<String>("甲执行成功了");
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
    @Async
    public Future<String> execAsync2(){
        try{
            Thread.sleep(4000);
            System.out.println("乙睡了4000ms");
            return new AsyncResult<String>("乙执行成功了");
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
    @Async
    public Future<String> execAsync3(){
        try{
            Thread.sleep(3000);
            System.out.println("丙睡了3000ms");
            return new  AsyncResult<String>("丙执行结束了");
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
}

 

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值