美文网首页
Springboot实战系列之@Async

Springboot实战系列之@Async

作者: 程序员小白成长记 | 来源:发表于2020-08-24 18:13 被阅读0次

    先看一个@Async的demo

    一、demo

    1,开启异步任务的开关

    在启动类上添加注解@EnableAsync


    image.png

    2,编写controller类

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.Future;
    
    @RestController
    public class TestAsyncController {
    
        @Autowired
        private TestAsyncService asyncService;
    
        @RequestMapping(value = "/test/async", method = RequestMethod.GET)
        @ResponseBody
        public String testAsync() {
            long start = System.currentTimeMillis();
            Future<String> asyncTaskRes1 = asyncService.asyncTask1();
            Future<String> asyncTaskRes2 = asyncService.asyncTask2();
            Future<String> asyncTaskRes3 = asyncService.asyncTask3();
            String str1 = "";
            String str2 = "";
            String str3 = "";
            try {
                str1 = asyncTaskRes1.get();
                str2 = asyncTaskRes2.get();
                str3 = asyncTaskRes3.get();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
            // System.out.println(str1 + str2 + str3);
            long end = System.currentTimeMillis();
            long time = end - start;
            return String.valueOf(time);
        }
    }
    

    3, service类

    @Async注解控制方法是否为异步的

    import org.springframework.scheduling.annotation.Async;
    import org.springframework.scheduling.annotation.AsyncResult;
    import org.springframework.stereotype.Service;
    
    import java.util.concurrent.Future;
    
    @Service
    public class TestAsyncService {
    
    
        @Async
        public Future<String> asyncTask1(){
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            String value = "asyncTask1";
            // 注意返回
            return new AsyncResult(value);
        }
    
        // @Async
        public Future<String> asyncTask2(){
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            String value = "asyncTask2";
            return new AsyncResult(value);
        }
    
        // @Async
        public Future<String> asyncTask3(){
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            String value = "asyncTask3";
            return new AsyncResult(value);
        }
        
    }
    

    结论

    本来如果不加@Async,每个方法需要花5秒,一共就是15s; 如果都加上@Async注解就在5-6s的时间(应该有线程调度的消耗)。

    相关文章

      网友评论

          本文标题:Springboot实战系列之@Async

          本文链接:https://www.haomeiwen.com/subject/mwgnjktx.html