• spring boot实现异步调用


    今天在这里学习下使用springboot的异步调用async

    首先使用@EnableAsync开启异步功能

    /**
    * @author fengzp
     * @date 17/5/8
     * @email fengzp@gzyitop.com
     * @company 广州易站通计算机科技有限公司
     */
    @SpringBootApplication
    @EnableAsync
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
    }
    

    测试类

        /**
     * @author fengzp
     * @date 17/5/8
     * @email fengzp@gzyitop.com
     * @company 广州易站通计算机科技有限公司
     */
    @Component
    public class AsyncTest {
    
        public static Random random =new Random();
    
        /**
    	 * @Async所修饰的函数不要定义为static类型,否则异步调用不会生效
    	 *
    	 * 这里通过返回Future<T>来返回异步调用的结果,实现异步回调
    	 */
    	@Async
    	public Future<String> test1() throws InterruptedException {
    	    System.out.println("test1 begin");
    	    long begin = System.currentTimeMillis();
    	    Thread.sleep(random.nextInt(10000));
    	    System.out.println("test1 end " + (System.currentTimeMillis() - begin));
    	    return new AsyncResult<String>("test1 is done!");
    	}
    
        @Async
        public Future<String> test2() throws InterruptedException {
            System.out.println("test2 begin");
            long begin = System.currentTimeMillis();
            Thread.sleep(random.nextInt(10000));
            System.out.println("test2 end " + (System.currentTimeMillis() - begin));
            return new AsyncResult<String>("test2 is done!");
        }
    
        @Async
        public Future<String> test3() throws InterruptedException {
            System.out.println("test3 begin");
            long begin = System.currentTimeMillis();
            Thread.sleep(random.nextInt(10000));
            System.out.println("test3 end " + (System.currentTimeMillis() - begin));
            return new AsyncResult<String>("test3 is done!");
        }
    }
    

    测试

    /**
     * @author fengzp
     * @date 17/5/8
     * @email fengzp@gzyitop.com
     * @company 广州易站通计算机科技有限公司
     */
    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = Application.class)
    public class Test {
    
        @Autowired
        AsyncTest asyncTest;
    
        @org.junit.Test
        public void test() throws InterruptedException {
            System.out.println("begin");
            long begin = System.currentTimeMillis();
            Future<String> test1 = asyncTest.test1();
            Future<String> test2 = asyncTest.test2();
            Future<String> test3 = asyncTest.test3();
    
            while(true) {
                if(test1.isDone() && test2.isDone() && test3.isDone())
                    break;
    
                Thread.sleep(500);
            }
    
            System.out.println("end 耗时: " + (System.currentTimeMillis() - begin));
        }
    }
    

    运行结果

  • 相关阅读:
    .net core读取appsettings.config中文乱码问题
    vs2017错误:当前页面的脚本发生错误
    VS Code中无法识别npm命令
    Visual Studio报错/plugin.vs.js,行:1074,错误:缺少标识符、字符串或数字
    记录一次在生成数据库服务器上出现The timeout period elapsed prior to completion of the operation or the server is not responding.和Exception has been thrown by the target of an invocation的解决办法
    Java集合框架
    java hash表
    Java Dictionary 类存储键值
    java数据结构 栈stack
    java封装
  • 原文地址:https://www.cnblogs.com/andyfengzp/p/6824253.html
Copyright © 2020-2023  润新知