zoukankan      html  css  js  c++  java
  • Spring异步方法注解 @Async

    @Async

    0. 介绍

    在Spring 3.x之后,通过内置@Async标明异步方法,可以简化异步开发流程。

    @Async既可提供无返回值的调用,也可提供有返回值的调用,下文将分别介绍两种使用方式。

    1. 代码Demo

    1.1 线程池配置

    Spring线程池配置有两种基本配置方式,此处实用其中一种

    <task:executor id="myexecutor" pool-size="5"  />  
    <task:annotation-driven executor="myexecutor"/> 

    1.2 无返回值的调用方式

    • 测试类
    @Component
    public class AsyncTask {
    
        @Async
        public void exec() throws Exception{
            System.out.println("准备睡觉:" + System.currentTimeMillis());
            Thread.sleep(10);
            System.out.println("醒了");
        }
    }

    -测试代码

    public class AsyncTaskTest extends AbstractTest {
    
        @Autowired
        private AsyncTask asyncTask;
    
        @Test
        public void testExec() throws Exception {
            for (int i= 0; i<5;i++)
                asyncTask.exec();
    
            Thread.sleep(1000L);
        }
    }
    • 测试结果
    准备睡觉:1511882628039
    准备睡觉:1511882628039
    准备睡觉:1511882628039
    准备睡觉:1511882628039
    准备睡觉:1511882628039
    醒了
    醒了
    醒了
    醒了
    醒了
    • 结果分析

    从代码输出来看,五个任务在同一时间被执行,说明@Async注解能够达到异步执行方法的目的。

    1.3 有返回值的调用

    @Async标记的方法,可返回AsyncResult结果,该类为Future子类,因此该类可通过future.get()和future.get(long timeout, TimeUnit unit)拿到返回结果;

    • 测试类
    @Component
    public class AsyncTask {
    
        @Async
        public Future<String> exec() throws Exception{
            System.out.println("准备睡觉" + System.currentTimeMillis());
            Thread.sleep(10);
            System.out.println("醒了");
            return new AsyncResult<String>("有力气了");
        }
    }
    • 测试代码
    public class AsyncTaskTest extends AbstractTest {
    
        @Autowired
        private AsyncTask asyncTask;
    
        @Test
        public void testExec() throws Exception {
            String asyncResult1 = asyncTask.exec().get();
            String asyncResult2 = asyncTask.exec().get();
            String asyncResult3 = asyncTask.exec().get();
            String asyncResult4 = asyncTask.exec().get(50, TimeUnit.MILLISECONDS);
            String asyncResult5 = asyncTask.exec().get(50, TimeUnit.MILLISECONDS);
    
            System.out.println("result1:" + asyncResult1);
            System.out.println("result2:" + asyncResult2);
            System.out.println("result3:" + asyncResult3);
            System.out.println("result4:" + asyncResult4);
            System.out.println("result5:" + asyncResult5);
        }
    }
    
    
    • 测试结果
    准备睡觉1511883563474
    醒了
    准备睡觉1511883563487
    醒了
    准备睡觉1511883563498
    醒了
    准备睡觉1511883563510
    醒了
    准备睡觉1511883563521
    醒了
    result1:有力气了
    result2:有力气了
    result3:有力气了
    result4:有力气了
    result5:有力气了
    • 结果分析

    通过设置超时时,可在约定时间内获取结果,避免程序hang住,该方法较为实用。

  • 相关阅读:
    随机数生成
    C#根据流下载文件
    C# 改变Windows中服务的登录身份 (账户名和密码)
    SqlServer查看数据库信息及服务器级、数据库级、数据库独立 用户权限
    C# 两个List<T>(T是类)使用Contains比较元素的方法
    你真正了解public、internal、protected、private吗?不妨幽默一些
    【WCF Restful】Post传参示范
    VMware虚拟机可与Win10物理机互ping并可访问互联网的设置方法
    服务器Oracle数据库配置与客户端访问数据库的一系列必要设置
    Winform ListBox输出信息并自动滚动至底部
  • 原文地址:https://www.cnblogs.com/jpfss/p/9754002.html
Copyright © 2011-2022 走看看