异步调用实现多线程处理任务 | 带你读《SpringBoot实战教程》之十四-阿里云开发者社区

开发者社区> 开发者学习资源库> 正文

异步调用实现多线程处理任务 | 带你读《SpringBoot实战教程》之十四

简介: 本节重点介绍异步调用

上一篇:定义全局异常处理器 | 带你读《SpringBoot实战教程》之十三
下一篇:官方推荐!SpringBoot这样整合JSP | 带你读《SpringBoot实战教程》之十五

本文来自于千锋教育在阿里云开发者社区学习中心上线课程《SpringBoot实战教程》,主讲人杨红艳,点击查看视频内容

21.异步调用:

在项目中,当访问其它接口较慢或者做耗时任务时,不想程序一直卡在耗时任务上,想程序能够并行执行,我们可以使用多线程来并行的处理任务,SpringBoot提供了异步处理方式@Async。
编写AsyncService:

public interface AsyncService {

    Future<String> doTask1()throws Exception;
    Future<String> doTask2()throws Exception;
    Future<String> doTask3()throws Exception;
}

编写AsyncServiceImpl:

@Service
public class AsyncServiceImpl implements AsyncService {
    
    public static Random random =new Random();     

    @Async
    @Override
    public Future<String> doTask1() 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<>("任务一完成");  
    }

    @Async
    @Override
    public Future<String> doTask2()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<>("任务二完成"); 
    }

    @Async
    @Override
    public Future<String> doTask3() 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<>("任务三完成"); 
    }

}

在Controller中调用service功能:

@Controller
public class TestController {
    
    @Autowired
    private AsyncService asyncService;    
    
    @RequestMapping("/async")
    @ResponseBody
    public String getEntityById() throws Exception {  
        
        long start = System.currentTimeMillis();  
  
        Future<String> task1 = asyncService.doTask1();  
        Future<String> task2 = asyncService.doTask2();  
        Future<String> task3 = asyncService.doTask3();  
  
        while(true) {  
            if(task1.isDone() && task2.isDone() && task3.isDone()) {  
                // 三个任务都调用完成,退出循环等待  
                break;  
            }  
            Thread.sleep(1000);  
        }  
  
        long end = System.currentTimeMillis();  
  
        return "任务全部完成,总耗时:" + (end - start) + "毫秒";  
    }  

}

要是使用异步的话,还需启动类中开始异步执行。
在启动类上加入@EnableAsync注解。
image.png

执行的结果为:
image.png
image.png

版权声明:本文中所有内容均属于阿里云开发者社区所有,任何媒体、网站或个人未经阿里云开发者社区协议授权不得转载、链接、转贴或以其他方式复制发布/发表。申请授权请邮件developerteam@list.alibaba-inc.com,已获得阿里云开发者社区协议授权的媒体、网站,在转载使用时必须注明"稿件来源:阿里云开发者社区,原文作者姓名",违者本社区将依法追究责任。 如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:developer2020@service.aliyun.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

开发者免费资源中心,技术电子书、会议PPT、论文资料持续供应中

官方博客
官网链接