最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring @async方法如何添加注解實現(xiàn)異步調用

 更新時間:2020年01月15日 14:56:05   作者:沫小淘  
這篇文章主要介紹了Spring @async方法如何添加注解實現(xiàn)異步調用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

這篇文章主要介紹了Spring @async方法如何添加注解實現(xiàn)異步調用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

在我們使用spring框架的過程中,在很多時候我們會使用@async注解來異步執(zhí)行某一些方法,提高系統(tǒng)的執(zhí)行效率。今天我們來探討下 spring 是如何完成這個功能的。

spring 在掃描bean的時候會掃描方法上是否包含@async的注解,如果包含的,spring會為這個bean動態(tài)的生成一個子類,我們稱之為代理類(?), 代理類是繼承我們所寫的bean的,然后把代理類注入進來,那此時,在執(zhí)行此方法的時候,會到代理類中,代理類判斷了此方法需要異步執(zhí)行,就不會調用父類 (我們原本寫的bean)的對應方法。spring自己維護了一個隊列,他會把需要執(zhí)行的方法,放入隊列中,等待線程池去讀取這個隊列,完成方法的執(zhí)行, 從而完成了異步的功能。

我們可以關注到再配置task的時候,是有參數(shù)讓我們配置線程池的數(shù)量的。因為這種實現(xiàn)方法,所以在同一個類中的方法調用,添加@async注解是失效的!,原因是當你在同一個類中的時候,方法調用是在類體內執(zhí)行的,spring無法截獲這個方法調用。

那在深入一步,spring為我們提供了AOP,面向切面的功能。他的原理和異步注解的原理是類似的,spring在啟動容器的時候,會掃描切面所定義的 類。在這些類被注入的時候,所注入的也是代理類,當你調用這些方法的時候,本質上是調用的代理類。通過代理類再去執(zhí)行父類相對應的方法,那spring只 需要在調用之前和之后執(zhí)行某段代碼就完成了AOP的實現(xiàn)了!

那最后我們還有一個問題,spring是如何動態(tài)的生成某一個類的子類的?代理類?

簡單介紹:

Spring為任務調度與異步方法執(zhí)行提供了注解支持。通過在方法上設置@Async注解,可使得方法被異步調用。也就是說調用者會在調用時立即返回,而被調用方法的實際執(zhí)行是交給Spring的TaskExecutor來完成。

開啟@Async注解:

<task:annotation-driven executor="annotationExecutor" />
<!-- 支持 @Async 注解 -->
<task:executor id="annotationExecutor" pool-size="20"/>

同時加入<context:component-scan />掃描注解。

為了比較,先來一個同步調用:

@Component
public class TestAsyncBean {
  public void sayHello4() throws InterruptedException {
    Thread.sleep(2 * 1000);//網絡連接中 。。。消息發(fā)送中。。。
    System.out.println("我愛你啊!");
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:/applicationContext.xml"})
public class TestAsync {
  @Test
  public void test_sayHello4() throws InterruptedException, ExecutionException {
    System.out.println("你不愛我了么?");
    testAsyncBean.sayHello4();
    System.out.println("回的這么慢, 你肯定不愛我了, 我們還是分手吧。。。");
    Thread.sleep(3 * 1000);// 不讓主進程過早結束
  }
}

輸出結果:

你不愛我了么?
我愛你啊!
回的這么慢, 你肯定不愛我了, 我們還是分手吧。。。 

 同步調用會按代碼順序依次進行下去,如果哪里需要等待,那么就阻塞在那里,不再向下繼續(xù)進行。

使用@Async的異步調用:

@Component
public class TestAsyncBean {
  @Async
  public void sayHello3() throws InterruptedException {
    Thread.sleep(2 * 1000);//網絡連接中 。。。消息發(fā)送中。。。
    System.out.println("我愛你啊!");
  }
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:/applicationContext.xml"})
public class TestAsync {
  @Autowired
  private TestAsyncBean testAsyncBean;
  @Test
  public void test_sayHello3() throws InterruptedException, ExecutionException {
    System.out.println("你不愛我了么?");
    testAsyncBean.sayHello3();
    System.out.println("你竟無話可說, 我們分手吧。。。");
    Thread.sleep(3 * 1000);// 不讓主進程過早結束
  }
}

輸出結果:

你不愛我了么?
你竟無話可說, 我們分手吧。。。
我愛你啊!

異步調用,通過開啟新的線程來執(zhí)行調用的方法,不影響主線程。異步方法實際的執(zhí)行交給了Spring的TaskExecutor來完成。

上面這種方式是沒有返回值的,下面嘗試有返回值的異步調用:

@Component
public class TestAsyncBean {
  @Async
  public String sayHello2() throws InterruptedException {
    Thread.sleep(2 * 1000);//網絡連接中 。。。消息發(fā)送中。。。
    return "我愛你啊!";// 調用方調用后會立即返回,所以返回null
  }
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:/applicationContext.xml"})
public class TestAsync {
  @Autowired
  private TestAsyncBean testAsyncBean;
  @Test
  public void test_sayHello2() throws InterruptedException, ExecutionException {
    System.out.println("你不愛我了么?");
    System.out.println(testAsyncBean.sayHello2());
    System.out.println("你說的啥? 我們還是分手吧。。。");
    Thread.sleep(3 * 1000);// 不讓主進程過早結束
  }
}

輸出結果:

你不愛我了么?
null
你說的啥? 我們還是分手吧。。。

通過直接獲取返回值得方式是不行的,這里就需要用到異步回調,異步方法返回值必須為Future<>,就像Callable與Future。

下面通過AsyncResult<>來獲得異步調用的返回值:

@Component
public class TestAsyncBean {
  @Async
  public Future<String> sayHello1() throws InterruptedException {
    int thinking = 2;
    Thread.sleep(thinking * 1000);//網絡連接中 。。。消息發(fā)送中。。。
    System.out.println("我愛你啊!");
    return new AsyncResult<String>("發(fā)送消息用了"+thinking+"秒");
  }
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:/applicationContext.xml"})
public class TestAsync {
  @Autowired
  private TestAsyncBean testAsyncBean;
  @Test
  public void test_sayHello1() throws InterruptedException, ExecutionException {
    Future<String> future = null;
    System.out.println("你不愛我了么?");
    future = testAsyncBean.sayHello1();
    System.out.println("你竟無話可說, 我們分手吧。。。");
    Thread.sleep(3 * 1000);// 不讓主進程過早結束
    System.out.println(future.get());
  }
}

輸出結果:

你不愛我了么?
你竟無話可說, 我們分手吧。。。
我愛你啊!

發(fā)送消息用了2秒

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • SpringBoot  jdbctemplate使用方法解析

    SpringBoot jdbctemplate使用方法解析

    這篇文章主要介紹了SpringBoot jdbctemplate使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • mybatis原理概述入門教程

    mybatis原理概述入門教程

    這篇文章主要介紹了在今天這篇博文中,我將要介紹一下mybatis的框架原理,以及mybatis的入門程序,實現(xiàn)用戶的增刪改查,她有什么優(yōu)缺點以及mybatis和hibernate之間存在著怎么樣的關系,大家這些問題一起通過本文學習吧
    2016-09-09
  • Java實現(xiàn)分頁的幾種方法詳細解析

    Java實現(xiàn)分頁的幾種方法詳細解析

    這篇文章主要介紹了Java實現(xiàn)分頁的幾種方法詳細解析,在Java中想實現(xiàn)分頁功能有幾種常用的方法,今天我們就來詳細解析一下,文中提供了解決思路和部分實現(xiàn)代碼,需要的朋友可以參考下
    2023-11-11
  • java Apache poi 對word doc文件進行讀寫操作

    java Apache poi 對word doc文件進行讀寫操作

    這篇文章主要介紹了Apache poi 對word doc文件進行讀寫操作的相關資料,需要的朋友可以參考下
    2017-01-01
  • Java Servlet上傳圖片到指定文件夾并顯示圖片

    Java Servlet上傳圖片到指定文件夾并顯示圖片

    在學習Servlet過程中,針對圖片上傳做了一個Demo,如果大家對Java Servlet上傳圖片到指定文件夾并顯示圖片功能感興趣的朋友大家通過本文一起學習吧
    2017-08-08
  • java自動生成接口文檔完整代碼示例

    java自動生成接口文檔完整代碼示例

    在軟件開發(fā)中,編寫接口文檔是一項必要但繁瑣的任務,為了簡化這一過程,可以通過使用Swagger2和Swagger-UI來自動生成接口文檔,這篇文章主要介紹了java自動生成接口文檔的相關資料,需要的朋友可以參考下
    2021-07-07
  • java線程并發(fā)semaphore類示例

    java線程并發(fā)semaphore類示例

    Java 5.0里新加了4個協(xié)調線程間進程的同步裝置,它們分別是Semaphore, CountDownLatch, CyclicBarrier和Exchanger,本例主要介紹Semaphore,Semaphore是用來管理一個資源池的工具,可以看成是個通行證
    2014-01-01
  • Spring Boot 中application.yml與bootstrap.yml的區(qū)別

    Spring Boot 中application.yml與bootstrap.yml的區(qū)別

    其實yml和properties文件是一樣的原理,且一個項目上要么yml或者properties,二選一的存在。這篇文章給大家介紹了Spring Boot 中application.yml與bootstrap.yml的區(qū)別,感興趣的朋友一起看看吧
    2018-04-04
  • Java?工具類實現(xiàn)音頻音量提升

    Java?工具類實現(xiàn)音頻音量提升

    本文主要介紹了可以將音頻提升音量的一個java工具類示例代碼,代碼具有一定的學習價值,感興趣的小伙伴來了解一下吧,,希望能夠給你帶來幫助
    2021-11-11
  • java并發(fā)之AtomicInteger源碼分析

    java并發(fā)之AtomicInteger源碼分析

    AtomicInteger是java并發(fā)包下面提供的原子類,主要操作的是int類型的整型,通過調用底層Unsafe的CAS等方法實現(xiàn)原子操作。下面小編和大家一起學習一下
    2019-05-05

最新評論

铜山县| 景东| 芜湖县| 西林县| 行唐县| 武鸣县| 泽州县| 广东省| 海伦市| 个旧市| 宝应县| 苗栗市| 神农架林区| 额敏县| 无锡市| 雷山县| 九江市| 张家港市| 井陉县| 西青区| 鸡泽县| 靖边县| 乌苏市| 纳雍县| 彭山县| 双城市| 游戏| 赤水市| 乌海市| 西华县| 扎兰屯市| 攀枝花市| 克什克腾旗| 多伦县| 德惠市| 郑州市| 勐海县| 青铜峡市| 东至县| 钟山县| 博罗县|